SpringMVC 검증 프레임워크 Validation 특수 사용법 자세히 보기

5085 단어 springmvc검증
기본적인 용법은 말할 것도 없고 인터넷의 예가 매우 많은데 여기서 주로 비교적 특수한 상황에서 사용하는 방법을 소개한다.
1. 그룹화
때때로 우리는 하나의 실체 클래스에 대해 다중 검증 방식을 필요로 한다. 서로 다른 상황에서 서로 다른 검증 방식을 사용한다. 예를 들어 하나의 실체 클래스에서 온 id에 대해 저장할 때 필요하지 않고 업데이트할 때 필수적이다. 다음과 같이 설정할 수 있다.

public class UserModel { 
 
  @NotNull(message = "{id.empty}", groups = { First.class }) 
  private int id; 
 
  @NotNull(message = "{username.empty}", groups = { First.class, Second.class }) 
  private String username; 
 
  @NotNull(message = "{content.empty}", groups = { First.class, Second.class }) 
  private String content; 
 
  public int getId() { 
    return id; 
  } 
 
  public void setId(int id) { 
    this.id = id; 
  } 
 
  public String getUsername() { 
    return username; 
  } 
 
  public void setUsername(String username) { 
    this.username = username; 
  } 
 
  public String getContent() { 
    return content; 
  } 
 
  public void setContent(String content) { 
    this.content = content; 
  } 
} 
public interface First { 
} 
 
public interface Second { 
} 
그룹을 통해 검증을 그룹으로 나누기
controler의 코드는 다음과 같습니다.

@RequestMapping(value = "/save.action", method = RequestMethod.POST) 
public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) { 
  if (result.hasErrors()) { 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 
 
@RequestMapping(value = "/update.action", method = RequestMethod.POST) 
public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) { 
  if (result.hasErrors()) { 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 
2. 그룹 시퀀스
기본적으로 서로 다른 그룹의 제약 검증은 무질서하지만 일부 상황에서 제약 검증의 순서는 매우 중요하다. 예를 들어 다음과 같은 두 가지 예가 있다. (1) 두 번째 그룹의 제약 검증은 하나의 안정 상태에 의존하여 운행하고 이 안정 상태는 첫 번째 그룹에서 검증한다.(2) 어떤 그룹의 검증은 비교적 시간이 걸리고 CPU와 메모리의 사용률이 비교적 높으며 가장 좋은 선택은 그것을 마지막에 놓고 검증하는 것이다.따라서 그룹 검증을 할 때 질서정연한 검증 방식을 제공해야 하기 때문에 그룹 서열의 개념을 제시했다.
한 그룹은 다른 그룹의 서열로 정의할 수 있으며, 그것을 사용하여 검증할 때 반드시 이 서열에 규정된 순서에 부합해야 한다.그룹 시퀀스 검증을 사용할 때 시퀀스 앞부분의 그룹 검증이 실패하면 뒤의 그룹은 더 이상 검증을 하지 않습니다.
다음 예제에서는 그룹 그룹A를 설명합니다.class,GroupB.class와 Group.class, 그중default, GroupA, GroupB는 모두 그룹의 서열이다.

public interface GroupA { 
} 
 
public interface GroupB { 
} 
 
@GroupSequence( { Default.class, GroupA.class, GroupB.class }) 
public interface Group { 
} 
 
public class User { 
  @NotEmpty(message = "firstname may be empty") 
  private String firstname; 
 
  @NotEmpty(message = "middlename may be empty", groups = Default.class) 
  private String middlename; 
 
  @NotEmpty(message = "lastname may be empty", groups = GroupA.class) 
  private String lastname; 
 
  @NotEmpty(message = "country may be empty", groups = GroupB.class) 
  private String country; 
} 
[java] view plain copy  CODE 
@RequestMapping(value = "/update.action", method = RequestMethod.POST) 
public String register(@Validated(Group.class) User user, BindingResult result) { 
  if (result.hasErrors()) { 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 
3. 여러 객체 확인
하나의 기능 처리 방법에서 여러 모델 대상을 검증해야 할 때 다음과 같은 형식으로 검증 결과를 얻어야 한다.

@RequestMapping("/validate/multi") 
public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) { 
 
  if (aErrors.hasErrors()) { // a  
    return "validate/error"; 
  } 
  if (bErrors.hasErrors()) { // a  
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 
모든 모델 대상의 뒤쪽은 Errors나 BindingResult 대상과 함께 검증 결과를 저장해야 하며, 방법체 내부에서는 이 두 개의 검증 결과 대상을 사용하여 오류가 발생했을 때 점프하는 페이지나 처리 논리를 선택할 수 있다.
4. Junit 테스트
사용자 정의 확장 Validation 에서는 다음과 같은 방법으로 테스트를 수행할 수 있습니다.

@Test 
public void testValidate() { 
  AnnotationDescriptor<EqualsAny> descriptor = new AnnotationDescriptor<EqualsAny>(EqualsAny.class); 
  EqualsAny equalsAny = AnnotationFactory.create(descriptor); 
  EqualsAnyValidator equalsAnyValidator = new EqualsAnyValidator(); 
  equalsAnyValidator.initialize(equalsAny); 
  Assert.assertTrue(equalsAnyValidator.isValid("123", null)); 
} 
또한 스프링이 사용자 정의 JSR-303 제한 형식에 대한 지원의 새로운 특성을 말하자면, 스프링 지원은 Constraint Validator에 bean 대상을 주입하는 것이다.예를 들어 Equals AnyValidator에서 @Resource 메모를 사용하여 다른 Bean 객체를 주입합니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기