通过AOP实现Controller层设置统一的入参校验


在使用@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());
    }
}














猜你喜欢

转载自blog.csdn.net/weixin_41404773/article/details/80735634