SpringMVC 매개 변수 검사, 자바 빈 과 기본 형식의 검사 (전재) 포함

26191 단어 springmvc
참고 블 로그: SpringMVC 파라미터 검사, 자바 빈 과 기본 유형의 검사 포함
1. spingmvc 는 Hibernate Validator 검사 프레임 워 크 를 도입 하고 주 소 를 참고 합 니 다.http://blog.csdn.net/menghuanzhiming/article/details/78059876
2. JavaBean 검사
1. javaben 의 실체 클래스 주석 검사:
package edu.hrbeu.platform.modeling.pojo;

import java.io.Serializable;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

public class User implements Serializable{
    private Integer userId;
    @NotEmpty
    @Pattern(regexp="^[A-Za-z\u4e00-\u9fa5]{2,10}$", message="   :2-10           ")
    private String username;

    @NotEmpty
    @Pattern(regexp="^[A-Za-z\u4e00-\u9fa5]{2,10}$", message="   :2-10           ")
    private String alias;

    @NotEmpty
    @Pattern(regexp="^(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\\d]{6,18}$", message="  :6-18        ,          ")
    private String password;

    @NotEmpty
    @Email
    private String email;

    @NotEmpty
    @Pattern(regexp="^1[0-9]{10}$", message="   :11          ")
    private String phone;   
}

2. javaben 은 주해 검사 등 라벨 을 정의 한 후 Controller 에 결합 하여 @ Valid 와 BindingResult 를 사용 하면 매개 변수의 검 사 를 완성 할 수 있 습 니 다.예 를 들 어 registerUser 방법 에 @ Valid 라벨 만 추가 하면 검 사 를 완성 할 수 있 습 니 다.검사 가 통과 되 지 않 으 면 오류 정 보 는 BindingResult 대상 에 봉 인 됩 니 다. bindingResult 와 관련 된 방법 으로 자세 한 오류 정 보 를 얻 고 사용자 에 게 되 돌려 줄 수 있 습 니 다.Binding Result 를 추가 하지 않 으 면 이상 을 던 집 니 다.이 때 폼 클래스 나 사용자 등록 과 같은 요청 한 매개 변수 검 사 를 완료 할 수 있 습 니 다. bindingResult 정 보 를 가 져 온 후 직접 return 을 선택 할 수 있 습 니 다.만약 에 이런 검사 가 필요 한 곳 이 비교적 많 으 면 각각 단독으로 처리 하 는 것 이 비교적 번 거 로 우 므 로 op 을 통 해 통일 적 으로 처리 하여 돌아 갈 수 있 고 나중에 말씀 드 리 겠 습 니 다.검 증 된 탭 참조:http://blog.csdn.net/catoop/article/details/51278675 관련 글:http://412887952-qq-com.iteye.com/blog/2312356
/**
     * 
    * @Title: RegisterUser
    * @Description: TODO(    )
    * @return Map        
    * @return
     */
    @RequestMapping("registerUser")
    @ResponseBody
    @Operationlog(desc="    ")
    public Map registerUser(
            @Valid 
            User user, 
            BindingResult bindingResult
            ) {
        while(bindingResult.hasErrors()) {
            System.out.println("      ");
            return null;
        }
        return null;
    }

2. 기본 유형 검사
많은 장면 에서 우 리 는 자바 빈 을 검사 할 필요 가 없고 하나의 int, String 등 을 검사 할 필요 가 없습니다.그러나 직접 쓰 면 소 용이 없습니다. 검증 프레임 워 크 는 검증 되 지 않 았 습 니 다. 우리 가 해 야 할 일 은 바로 그것 을 효력 을 발생 시 키 는 것 입 니 다.다음 참조:https://diamondfsd.com/article/78fa12cd-b530-4a90-b438-13d5a0c4e26c 여기 링크 내용 써 주세요.
1. controller 층 에 주석 검사 추가: controller 층 방법 코드 는 다음 과 같 습 니 다. javabean 의 검사 도 있 고 간단 한 매개 변수 검사 도 있 습 니 다.
/**
     * 
    * @Title: RegisterUser
    * @Description: TODO(    )
    * @return Map        
    * @param user
    * @param confirmPassword
    * @param vercode
    * @param request
    * @return
     */
    @RequestMapping("registerUser")
    @ResponseBody
    @Operationlog(desc="    ")
    public Map registerUser(
            @Valid 
            User user, 
            BindingResult bindingResult,
            @NotEmpty
            String confirmPassword,
            @NotEmpty
            String vercode) {
        return null;
    }

2. aop 를 설정 하여 javabean 의 검사 정보 BindingResult 를 통일 적 으로 관리 하고 간단 한 매개 변수 에 대한 설명 검사 가 적 용 됩 니 다. (1) springmvc 의 contrller 설정 aop 주의사항: 연결 참조:http://blog.csdn.net/menghuanzhiming/article/details/78780612 op 을 사용 할 수 없다 면 jar 패키지 가 충돌 하 는 지 확인 하 십시오.
(2) 프로필: spring - aspect. xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                            http://www.springframework.org/schema/context    
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd    
                            http://www.springframework.org/schema/mvc    
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                            http://www.springframework.org/schema/tx
                            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
                            http://www.springframework.org/schema/aop 
                            http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

    
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    
    <bean id="requestParamValidAspect" class="edu.hrbeu.platform.modeling.common.aspect.RequestParamValidAspect"/>
beans>  

springmvc 프로필 에 spring - aspect. xml 파일 도입:
"1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                            http://www.springframework.org/schema/context    
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd 
                            http://www.springframework.org/schema/task
                            http://www.springframework.org/schema/task/spring-task-3.1.xsd   
                            http://www.springframework.org/schema/mvc    
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    ...
      
    ...
    "spring-aspect.xml"/>

절단면 클래스 RequestParamValidAspect:
package edu.hrbeu.platform.modeling.common.aspect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.ElementKind;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableValidator;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.hibernate.validator.internal.engine.path.NodeImpl;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;

import edu.hrbeu.platform.modeling.exception.ParamValidException;
import edu.hrbeu.platform.modeling.pojo.SimpleFiledError;

/**
 * 
* @ClassName: RequestParamValidAspect 
* @Description: TODO(controller    aspectj) 
* @author chenliming
* @date 2017 12 12    10:27:36 
*
 */
@Aspect
public class RequestParamValidAspect {
    private final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    private final ExecutableValidator validator = factory.getValidator().forExecutables();
    Logger log = LoggerFactory.getLogger(getClass());

    @Pointcut("execution(public java.util.Map edu.hrbeu.platform.modeling.*.controller.*.*(..))")
    public void controllerAround() {
    }

    ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();

    /**
     * 
    * @Title: around
    * @Description: TODO(    ,  controller  )
    * @return Object        
    * @param pjp
    * @return
    * @throws Throwable
     */
    @Around("controllerAround()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("aspect    start.....");
        try {
            //    ,     ,       
            Object[] args = pjp.getArgs();
            if (args.length == 0) {
                return pjp.proceed();
            }

            List simpleFiledErrors = new ArrayList<>();
            /**************************       javabean **********************/
            //    BindingResult     ,       error,          
            for (Object arg : args) {
                if (arg instanceof BeanPropertyBindingResult) {
                    //    
                    BeanPropertyBindingResult result = (BeanPropertyBindingResult) arg;
                    if (result.hasErrors()) {
                        List list = result.getAllErrors();
                        for (ObjectError error : list) {
//                          System.out.println(
//                                  error.getCode() + "---" + error.getArguments() + "--" + error.getDefaultMessage());
                            String name = null;
                            if(error instanceof FieldError) {
                                //    
                                name = ((FieldError)error).getField();
                            } else {
                                //    
                                name = error.getObjectName();
                            }

                            SimpleFiledError simpleFiledError = new SimpleFiledError();
                            simpleFiledError.setName(name);
                            simpleFiledError.setMessage(error.getDefaultMessage());
                            simpleFiledErrors.add(simpleFiledError);
                        }
                    }
                }
            }

            /**************************        *************************/
            //         
            Object target = pjp.getThis();
            //        
            Method method = ((MethodSignature) pjp.getSignature()).getMethod();
            //     ,      
            Set> validResult = validMethodParams(target, method, args);
            //          
            if (!validResult.isEmpty()) {
                String[] parameterNames = parameterNameDiscoverer.getParameterNames(method); //          

                for (ConstraintViolation constraintViolation : validResult) {
                    PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath(); //            
                    NodeImpl leafNode = pathImpl.getLeafNode();

                    //         (   bean       index,    )
                    if(leafNode.getKind() == ElementKind.PARAMETER) {
                        int paramIndex = leafNode.getParameterIndex(); //          
                        String paramName = parameterNames[paramIndex]; //          

//                      //    
//                      System.out.println(paramName);
//                      //     
//                      System.out.println(constraintViolation.getMessage());

                        SimpleFiledError simpleFiledError = new SimpleFiledError();
                        simpleFiledError.setName(paramName);
                        simpleFiledError.setMessage(constraintViolation.getMessage());
                        simpleFiledErrors.add(simpleFiledError);
                    }

                }
            }

            if(!simpleFiledErrors.isEmpty()) {
                Map map = new HashMap();
                map.put("success", false);//    
                map.put("message", "       ");//    
                map.put("filedErrors", simpleFiledErrors);
                return map;
            }

            return pjp.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
            throw e;
        }
    }

    public void before(JoinPoint point) throws ParamValidException {
        //         
        Object target = point.getThis();
        //         
        Object[] args = point.getArgs();
        //        
        Method method = ((MethodSignature) point.getSignature()).getMethod();

        //     ,      
        Set> validResult = validMethodParams(target, method, args);

        if (!validResult.isEmpty()) {
            String[] parameterNames = parameterNameDiscoverer.getParameterNames(method); //          

            List errors = new ArrayList<>();
            for (ConstraintViolation constraintViolation : validResult) {
                PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath(); //            
                int paramIndex = pathImpl.getLeafNode().getParameterIndex(); //          
                String paramName = parameterNames[paramIndex]; //          

                SimpleFiledError error = new SimpleFiledError(); //               ,      
                error.setName(paramName); //     (         )
                error.setMessage(constraintViolation.getMessage()); //        
                errors.add(error);

                System.out.println(paramName);
                //     
                System.out.println(constraintViolation.getMessage());
            }

            throw new ParamValidException(errors); //         ,    ,      

        }
    }

    private  Set> validMethodParams(T obj, Method method, Object[] params) {
        return validator.validateParameters(obj, method, params);
    }
}

절단면 류 의 서 라운드 강 화 는 검사 오 류 를 모 아 되 돌려 줍 니 다.
파라미터 이상 처리 클래스 ParamValidException:
package edu.hrbeu.platform.modeling.exception;

import java.util.List;

import edu.hrbeu.platform.modeling.pojo.SimpleFiledError;

public class ParamValidException extends Exception{
    private static final long serialVersionUID = 1L;

    private List fieldErrors;
    public ParamValidException(List fieldErrors) {
        this.fieldErrors = fieldErrors;
    }
}

사용자 정의 오류 실체 클래스 Simple Filed 오류 검사:
package edu.hrbeu.platform.modeling.pojo;

public class SimpleFiledError {
    private String name;
    private String message;

    public SimpleFiledError() {
        super();
        // TODO Auto-generated constructor stub
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }


}

좋은 웹페이지 즐겨찾기