在使用@Valid校验属性时,需要回去异常信息。如果不做处理,会显示整个异常对象,记住这个异常获取是方法之前,不是在执行方法的时候。
这个时候我们想要显示message可以使用AOP
第一步
package com.xgn.cms.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.validation.BindingResult; import java.lang.reflect.Method; import java.util.Optional; /** * Created with IntelliJ IDEA. * Description: * Date: 2018-06-11 * Time: 2:18 PM * * @author: MarkFan * @since v1.0.3 */ @Aspect @Component public class ControllerArgument { /** * 对controller 入口参数进行基本校验 * 只有第一个参数有 @Validate 注解 * * @param joinPoint * @see org.springframework.validation.annotation.Validated * 第二个是 {@link BindingResult} 才管用 */ @Before("execution(public * com.xgn.cms.web.controller.*.*(..))") public void beforeMethod(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); if (args.length > 1 && args[1] instanceof BindingResult) { BindingResult bindingResult = (BindingResult) args[1]; /** * {@code bindResult} 不为空并且存在错误 */ Optional.ofNullable(bindingResult) .filter(result -> !result.hasErrors()) .orElseThrow(() -> new IllegalArgumentException(bindingResult .getFieldError().getDefaultMessage())); } } }
这一步可以要或者不要,如果不要可以直接在Controller抛出异常给前端
package com.example.jedis.advice; import com.example.jedis.exception.CMSException; import com.example.jedis.response.ResultClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * com.xinguangnet.tuchao.merchant.manage * * @Author : Wukn * @Date : 2018/6/20 */ @ControllerAdvice public class RedisAdvice { private static final Logger logger = LoggerFactory.getLogger(RedisAdvice.class); @ExceptionHandler(CMSException.class) @ResponseBody public Object handleException(CMSException ex) { logger.error("异常,errorMsg:", ex); return new ResultClient<>(ex.getCode(), ex.getMsg()); } @ExceptionHandler(Exception.class) @ResponseBody public Object handleException(Exception ex) { logger.error("handleException,errorMsg:", ex); return new ResultClient<>(ex.getMessage()); } }