异常处理

本文介绍了Hibernate Validator的使用方法,包括验证失败时抛出异常的处理方式,并提供了自定义异常及异常处理切面的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先提倡下Hibernate的验证器,功能强大且使用方面,Hibernate Validator提供包括国际化,传统的字符空,非法的输入等,而且给了很友善的message信息。

public class BeanValidators {

	/**
	 * 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException, 而不是返回constraintViolations.
	 */
	public static void validateWithException(Validator validator, Object object, Class<?>... groups)
			throws ConstraintViolationException {
		Set constraintViolations = validator.validate(object, groups);
		if (!constraintViolations.isEmpty()) {
			throw new ConstraintViolationException(constraintViolations);
		}
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>中为List<message>.
	 */
	public static List<String> extractMessage(ConstraintViolationException e) {
		return extractMessage(e.getConstraintViolations());
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为List<message>
	 */
	public static List<String> extractMessage(Set<? extends ConstraintViolation> constraintViolations) {
		List<String> errorMessages = new ArrayList<String>();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.add(violation.getMessage());
		}
		return errorMessages;
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为Map<property, message>.
	 */
	public static Map<String, String> extractPropertyAndMessage(ConstraintViolationException e) {
		return extractPropertyAndMessage(e.getConstraintViolations());
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为Map<property, message>.
	 */
	public static Map<String, String> extractPropertyAndMessage(Set<? extends ConstraintViolation> constraintViolations) {
		Map<String, String> errorMessages = new HashMap<String, String>();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage());
		}
		return errorMessages;
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e) {
		return extractPropertyAndMessageAsList(e.getConstraintViolations(), " ");
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolations>为List<propertyPath message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations) {
		return extractPropertyAndMessageAsList(constraintViolations, " ");
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath + separator + message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e, String separator) {
		return extractPropertyAndMessageAsList(e.getConstraintViolations(), separator);
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为List<propertyPath + separator + message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations,
			String separator) {
		List<String> errorMessages = new ArrayList<String>();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.add(violation.getPropertyPath() + separator + violation.getMessage());
		}
		return errorMessages;
	}
}

 
HibernateValidator

结合HibernateValidator,添加自定义的exception

 

public class CustormizeException extends RuntimeException {

    private static final long serialVersionUID = -3703423976960486177L;

    private int errorCode;

    public CustormizeException(ResultCode statusCode) {
        this(statusCode, null);
    }

    public CustormizeException(ResultCode resultCode, String message) {
        super(resultCode.name() + (message == null ? "" : " " + message));
        this.errorCode = resultCode.code();
    }

    public String toString() {
        return String.format("{\"errorCode\":\"%s\",\"errorMsg\":\"%s\"}", errorCode, this.getMessage());
    }

    public int getErrorCode() {
        return errorCode;
    }

    public boolean checkStatus(ResultCode resultCode) {
        return errorCode == resultCode.code();
    }

}

 增加异常处理的切面处理器,能够很快的捕获信息,反馈给各个终端设备,而不至于抛出恶心的代码异常信息。

@ControllerAdvice
public class CustormizeExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = {CustormizeException.class})
    public final ResponseEntity<?> handleException(CustormizeException exception, WebRequest request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("text/plain; charset=UTF-8"));
        return handleExceptionInternal(exception,
                exception.getCode() + ":" + exception.getMessage(),
                headers,
                exception.status,
                request);
    }

    @ExceptionHandler(value = {ConstraintViolationException.class})
    public final ResponseEntity<?> handleException(ConstraintViolationException exception, WebRequest request) {
        Map<String, String> errors = BeanValidators.extractPropertyAndMessage(exception.getConstraintViolations());
        String errorBody = JSON.toJSONString(errors, true);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("text/plain; charset=UTF-8"));
        return handleExceptionInternal(exception,
                errorBody,
                headers,
                HttpStatus.BAD_REQUEST,
                request);
    }


}

 总结:

异常处理其实不会让你头疼,但是我们常常忽略把异常丢给用户,这种事情成妾做不到,只能通过切面的方式在方法后捕获,然后进行反馈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值