Spring Validator 인터페이스 검사 및 전역 이상 프로세서

Spring Validator 인터페이스 검사
이전 로 그 는 Bean Validation 검사 체 제 를 사용 하여 기본 데이터 형식 을 검증 합 니 다.방법 은 실체 류 속성 에 주석 표지 검증 방식 을 사용 하고 마지막 으로 Controller 류 에서 구체 적 인 방법의 형 삼 에@Vlidated 주 해 를 추가 하 는 것 입 니 다.Bean Validation 검 사 는 한 가지 단점 이 있 습 니 다.우리 의 데이터 검 사 는 자바 실체 류 에서 제약 을 받 는 것 입 니 다.만약 에 우리 가 여러 개의 프로세서 방법 으로 같은 실체 류 를 사용 해 야 한다 면 실체 류 속성 에 대한 검사 규칙 을 정의 하기 어렵 습 니 다.어떤 처리 기 는 하나의 속성 만 검사 하고 어떤 처리 기 는 여러 개의 속성 을 검사 해 야 합 니 다.우 리 는 모든 프로세서 에 실체 클래스 를 만 들 수 없다.해결 방법 은 이전 로그 에서 도 말 했 듯 이 그룹 검사 방식 을 사용 합 니 다.그 밖 에 Spring 의 Validator 인터페이스 검 사 를 사용 할 수 있 습 니 다.외부 에서 대상 의 검사 규칙 을 지정 할 수 있 습 니 다.
검사 기 구현 클래스
Spring 의 Validator 는 하나의 인터페이스 입 니 다.우리 자신의 검증 실현 클래스 는 이 인 터 페 이 스 를 실현 해 야 재 작성 방법 으로 사용자 정의 검증 규칙 을 완성 할 수 있 습 니 다.우리 가 실현 해 야 할 방법 은 두 가지 가 있 습 니 다.supports()와 vaidate()입 니 다.

public class UserValidator implements Validator {
	@Override
	public boolean supports(Class<?> clazz) {
		//         class           
		return User.class.equals(clazz);
	}
 
	@Override
	public void validate(Object obj, Errors errors) {
		//       errors  
		ValidationUtils.rejectIfEmpty(errors, "username", "Username.is.empty", 
				"        。");
		User user = (User) obj;
		if (user.getPassword() == null || user.getPassword().equals("")) {
			// rejectValue()  :     ,     ,        
			errors.rejectValue("password", "Password.is.empty", "       。");
		} else if (user.getPassword().length() < 8) {
			errors.rejectValue("password", "Length.too.short", "          。");
		}
	}
}
Support()방법의 기능 은 이 검사 클래스 가 검 증 된 실체 클래스 를 지원 하 는 지 판단 하 는 것 입 니 다.예 를 들 어 우리 의 이 검사 클래스 는 User 클래스 를 검사 하고 supports()방법 은 검 증 된 실체 클래스 에 들 어가 반사 체 제 를 통 해 User 클래스 의 인 스 턴 스 를 얻 은 다음 에 들 어 오 는 검 증 된 실체 클래스 와 일치 하 는 지 판단 합 니 다.Validate()방법 은 검 사 를 하 는 구체 적 인 실현 방법 입 니 다.방법 매개 변수 목록 에 Errors 대상 이 있 고 검 사 된 오류 정 보 를 안에 저장 합 니 다.다음은 구체 적 인 검사 규칙 입 니 다.저 희 는 ValidationUtils 검사 도구 류 의 방법 으로 검 사 를 할 수 있 습 니 다.제 공 된 매개 변 수 는 오류 정보 대상 error,검 증 된 필드 이름(실체 클래스 의 속성 을 검사 하 는 것),전역 오류 코드(Bean Validation 검사 에서 오류 코드 에 따라 외부 properties 의 오류 알림 정 보 를 사용 하 는 것 과 유사 합 니 다)입 니 다.마지막 매개 변 수 는 기본 오류 알림 정보 입 니 다.전역 오류 코드 가 해당 하 는 알림 정 보 를 찾 지 못 했 을 때 기본 오류 알림 정 보 를 사용 합 니 다.
ValidationUtils 검사 도구 류 를 사용 하 는 것 외 에 도 23 번 째 줄 은 erroe 대상 의 방법 을 사용 하여 검사 오류 정 보 를 얻 을 수 있 습 니 다.매개 변 수 는 ValidationUtils 류 와 거의 일치 합 니 다.
컨트롤 러 구현 클래스
검사 기 류 를 설정 한 후 구체 적 인 업무 논리 처리 부분,Controller 류 에서 사용 합 니 다.

@Controller
@RequestMapping("user")
public class InterfaceValidationController {
	@InitBinder
	public void initBinder(DataBinder binder) {
		//  DataBinder    Validator    
		binder.setValidator(new UserValidator());
	}
	
	@RequestMapping("login")
	public String login(Model model, @Valid User user, BindingResult result) {
		List<ObjectError> allErrors = null;
		if (result.hasErrors()) {
			allErrors = result.getAllErrors();
			//         
			for(ObjectError objectError : allErrors) {
				System.out.println("code = " + objectError.getCode() + 
						"DefaultMessage = " + objectError.getDefaultMessage());
				//             
				model.addAttribute("allErrors", allErrors);
			}
			
			//       
			return "users/login";
		} else {
			//         ,          
			return "users/successLogin";
		}
	}
먼저 initBinder()방법 을 통 해 Controller 클래스 방법 에서 검사 기의 바 인 딩 이 필요 하 며,방법 은 DataBinder 대상 파라미터 가 필요 하 며,DataBinder 대상 의 기능 은 데이터 바 인 딩 을 통 해 데 이 터 를 유형 변환 하고 검사 기 등 을 설정 할 수 있 습 니 다.DataBinder 는 한 구성원 변수 BindingResult 가 있 습 니 다.데이터 바 인 딩 을 실 시 했 습 니 다.데이터 에 오류 정보 가 있 으 면 BindingResult 대상 의 Errors 속성 에 넣 습 니 다.Errors 대상 은 앞에서 말 했 듯 이 오류 정 보 를 저장 하 는 데 사 용 됩 니 다.Controller 의 구체 적 인 방법의 매개 변수 목록 에 검사 할 데이터 대상 User 클래스 에@Valid 주 해 를 추가 하고 표 지 는 이 대상 에 대해 데이터 검 사 를 한 다음 에 BindingResult 대상 을 추가 합 니 다.15 번 째 줄 에서 우 리 는 이 대상 의 hasErrors()방법 을 통 해 오류 여 부 를 판단 한 다음 getAllErrors()방법 으로 오류 정 보 를 가 져 와 출력 할 수 있 습 니 다.마지막 으로 22 줄 에서 저 희 는 오류 정 보 를 전단 페이지 에 전송 하여 사용자 에 게 알려 줍 니 다.
전단 페이지 테스트
마지막 으로 전단 페이지 에서 간단 한 로그 인 테스트 를 진행 합 니 다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>    </title>
</head>
<body>
	<from action="login.action" method="post">
		   :<input type="text" name="username" /></br>
		  :  &nbsp;&nbsp;&nbsp;<input type="password" name="password" /></br>
		<input type="submit" value="  "/>
		<!--          -->
		<c:if test="${allErrors != null }">
			<c:forEach items="${allErrors}" var="error">
				</br><font color="red">${error.defaultMessage}</font>
			</c:forEach>
		</c:if>
	</from>
</body>
</html>
15 번 째 줄 은 배경 에서 보 내 온 allErrors 오류 정보 집합 을 옮 겨 다 니 며 검사 오류 가 발생 하면 오류 메 시 지 를 표시 합 니 다.이전 검사 기의 설정 에 따라 User 클래스 대상 의 데이터 검사 에 대해 사용자 이름과 비밀 번 호 를 비 울 수 없습니다.

입력 정보 가 정확 하고 사용자 이름과 비밀번호 가 비어 있 지 않 으 며 비밀번호 길이 가 8 자리 보다 낮 지 않 으 면 성공 적 으로 점프 할 수 있 습 니 다.

전역 이상 프로세서 예외 Resolver
프로그램 이 실 행 될 때의 오류 정 보 는 로 그 를 통 해 오 류 를 조사 할 수 있 습 니 다.오류 정 보 를 전단 페이지 에 전송 할 때 사용자 가 오류 원인 을 알 아 볼 수 있 도록 오류 정 보 를 처리 하고 정 보 를 전단 페이지 앞 에 전송 하여 캡 처 해 야 합 니 다.오류 정보 캡 처 와 가공 처 리 를 완료 하려 면 이상 처리 장 치 를 설정 해 야 합 니 다.이상 처리 장 치 는 프로그램 이 실 행 될 때 이상 을 어떻게 처리 하 는 지 사용자 정의 하 는 데 사 용 됩 니 다.이상 클래스 를 사용자 정의 해 야 합 니 다.이상 한 정 보 를 저장 합 니 다.이상 처리 장 치 를 설정 해 야 합 니 다.포 착 된 이상 에 대해 서 는 사용자 정의 이상 클래스 에 설 치 된 예상 이상 이 라면 해당 하 는 오류 정 보 를 던 져 야 합 니 다.그렇지 않 으 면 다른 디 스 플레이 를 진행 합 니 다.
사용자 정의 이상 클래스
우선 사용자 정의 이상 클래스 입 니 다.예제 에 서 는 user 류 를 처리 하 는 이상 클래스 와 이상 처리 장 치 를 정의 합 니 다.이상 클래스 에 서 는 user 류 에 이상 이 생 겼 을 때 오류 정보 저장 소 를 설정 합 니 다.

package com.mvc.exception;
 
public class UserException extends Exception {
	private static final long serialVersionUID = 1L;
	private String exceptionMessage;
	
	public UserException(String exceptionMessage) {
		super(exceptionMessage);
		this.exceptionMessage = exceptionMessage;
	}
	
	public String getExceptionMessage() {
		return exceptionMessage;
	}
	public void setExceptionMessage(String exceptionMessage) {
		this.exceptionMessage = exceptionMessage;
	}
}
사용자 정의 이상 클래스 UserException 은 User 클래스 이상 을 처리 하 는 것 을 전문 적 으로 책임 집 니 다.User 클래스 를 어떻게 지정 합 니까?이것 은 이상 프로세서 에서 완 료 됩 니 다.UserException 은 Exception 류 를 계승 하여 구체 적 인 Controller 방법 에서 throws 를 던 질 수 있 습 니 다.이 클래스 에 서 는 이상 정 보 를 저장 하 는 이상 정보 변 수 를 정의 합 니 다.이상 프로세서 가 User 클래스 의 이상 을 포착 할 때 UserException 의 구조 방법 을 통 해 이상 정 보 를 설정 하고 마지막 으로 UserException 을 던 집 니 다.
이상 프로세서
이상 처리 장치 의 설정 에 왔 습 니 다.이상 처리 장 치 는 이상 을 캡 처 하고 처리 하 는 핵심 입 니 다.Spring MVC 에서 바 텀 이상 은 1 급 으로 위로 던 지고 마지막 으로 전체 이상 처리 장치 에 도착 합 니 다.전체 이상 처리 장 치 는 주로 4 단계 가 있 습 니 다.
  • 이상 포획,이상 유형 분석.
  • 4.567917.이상 이 예상 이상(정 의 된 이상 류 가 있 음)이 라면 해당 하 는 이상 정 보 를 던 집 니 다4.567917.이상 이 예상 이상 이 아니라면 사용자 정의 이상 류 를 만 들 고 해당 하 는 이상 정 보 를 던 집 니 다(예 를 들 어'알 수 없 는 이상 정보')4.567917.이상 정 보 를 전단 페이지 에 연결 하고 해당 하 는 이상 정보 페이지 로 이동 합 니 다위의 사용자 정의 이상 클래스 와 결합 하여 User 클래스 에 대한 이상 프로세서 설정 을 보십시오.
    
    package com.mvc.exception;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
     
    public class UserExceptionResolver implements HandlerExceptionResolver {
    	@Override
    	public ModelAndView resolveException(HttpServletRequest request, 
    			HttpServletResponse response, Object handler, Exception ex) {
    		//           
    		UserException userException = null;
    		if (ex instanceof UserException) {
    			//        UserException,             
    			userException = (UserException) ex;
    		} else {
    			//               
    			userException = new UserException("      。");
    		}
    		
    		//       
    		String errorMessage = userException.getExceptionMessage();
    		ModelAndView modelAndView = new ModelAndView();
    		//            
    		modelAndView.addObject("errorMessage", errorMessage);
    		//          
    		modelAndView.setViewName("errorPage/userError");
    		
    		return modelAndView;
    	}
    	
    }
    Spring MVC 에서 이상 정 보 는 최종 적 으로 Dispatcher Servlet 을 통 해 전역 이상 프로세서 로 처리 되 며,전역 이상 프로세서 가 HandlerException Resolver 인터페이스 연결 을 실현 하고,안에 있 는 resolver Exception()을 다시 쓰 는 방법 으로 이상 처 리 를 완료 해 야 합 니 다.이 방법 에는 두 개의 인자 가 있 습 니 다.object handler 는 이상 프로세서 가 처리 할 대상 을 지정 합 니 다.Exception ex 는 바 텀 에서 던 진 이상 을 받 아들 이 는 것 이 분명 합 니 다.
    이상 프로세서 UserException Resolver 에서 14 번 째 줄 은 이상 유형 이 우리 가 정의 한 예상 이상 UserException 인지 먼저 판단 합 니 다.그렇지 않 으 면 던 집 니 다.그렇지 않 으 면 사용자 정의 이상 유형 을 만 들 고 오류 알림 을 보 냅 니 다."알 수 없 는 오류 가 발생 했 습 니 다."마지막 으로 26 번 째 줄 에서 이상 정 보 를 처리 한 후 전단 페이지 로 보 내 고 오류 알림 인터페이스 로 이동 합 니 다.
    테스트 용례
    마지막 으로 이상 프로 세 서 를 사용 하려 면 Spring 프로필 에 이 이상 프로 세 서 를 추가 해 야 합 니 다.
    
    <!--           -->
    <bean class="com.mvc.exception.UserExceptionResolver"></bean>
    그리고 Controller 류 방법 에서 해당 하 는 판단 을 하고 예상 이상 이 발생 하면 던 집 니 다.
    
    @Controller
    @RequestMapping("user")
    public class InterfaceValidationController {
    	@InitBinder
    	public void initBinder(DataBinder binder) {
    		//  DataBinder    Validator    
    		binder.setValidator(new UserValidator());
    	}
     
    	@RequestMapping("login")
    	public String login(Model model, @Valid User user, BindingResult result) 
    			throws UserException {
    		boolean allowVisit = checkUser(user);
    		if (!allowVisit) {
    			//          ,    
    			throw new UserException("       !");
    		}
    		
    		List<ObjectError> allErrors = null;
    		if (result.hasErrors()) {
    			allErrors = result.getAllErrors();
    			//         
    			for(ObjectError objectError : allErrors) {
    				System.out.println("code = " + objectError.getCode() + 
    						"DefaultMessage = " + objectError.getDefaultMessage());
    				//             
    				model.addAttribute("allErrors", allErrors);
    			}
    			
    			//       
    			return "users/login";
    		} else {
    			//         ,          
    			return "users/successLogin";
    		}
    	}
    57 번 째 줄 을 볼 수 있 습 니 다.마지막 으로 오류 페이지 로 이동 하여 오류 정 보 를 표시 합 니 다.
    
    <%@ page language="java" import="java.util.*" 
    	contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta charset="utf-8">
    <title>    </title>
    </head>
    <body>
    	    ,      :</br>
    	<h3>
    		<font color="red">${errorMessage}</font>
    	</h3></br>
    </body>
    </html>

    전체 코드 가 GitHub 에 업로드 되 었 습 니 다.
    https://github.com/justinzengtm/SSM-Framework/tree/master/SpringMVC_Project
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기