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>
: <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 단계 가 있 습 니 다.
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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.