2010-03-18 4 views
2

사용자의 모든 데이터를 저장하는 사용자라는 개체가 있습니다. 유효성 검사를 수행 할 몇 가지 주석을 가지고 있으며 정상적으로 작동합니다.봄 : 동일한 개체, 다른 유효성 확인

public class User{ 
    @NotEmpty 
    @Email 
    @Size(max=100) 
    @Column(name="username", length=100, nullable=false, unique=true) 
    private String username; 

    @NotEmpty 
    @Size(min=5, max=40) 
    @Column(name="password", length=40, nullable=false) 
    private String password; 

    @Size(min=5, max=40) 
    @Transient 
    private String newPassword; 

    // other attributes ,getters and setters 
} 

나는 두 개의 다른 형태 (각각 다른 페이지에 있음)를 가지고 있습니다. 처음에는 사용자를 만들기 위해 사용자 이름과 암호를 묻습니다. 따라서 두 가지 모두 필수적입니다.

두 번째 형식에서는 사용자 이름, 다른 데이터 (유효성이 검사 됨) 및 암호 및 newPassword와 같은 사용자 정보를 보여줍니다. newPassword가 설정되어 있고 암호가 사용자와 동일하면 사용자의 암호가 변경되지만 비어있는 경우 암호를 변경하면 안됩니다.

문제는 필드 암호에 대해 다른 유효성 검사가있는 동일한 개체와 관련된 두 가지 형식이 있다는 것입니다. 처음에는 빈 상태가 아니어야하지만 두 번째 상태에서는 비어있을 수 있습니다.

나는이 방법으로 개체를 확인 컨트롤러에서

:

public String getUserDetails(@Valid @ModelAttribute("User") User user, BindingResult result, Model model){ 
    if(result.hasErrors()){ 
     //There have been errors 
    } 
    ... 
} 

있지만 암호는 오류가있을 것입니다 비어 있습니다.

개체의 일부 필드에서만 유효성 검사를 수행 할 수있는 방법이 있습니까?

유효성 검사 후 유효성 검사 오류를 제거 할 수 있습니까?

이 경우 가장 좋은 방법은 무엇입니까?

감사

답변

3

이 선언적 유효성 검사 문제, 그것은 이런 종류의 작업을 수행하는 것은 매우 쉬운 일이 아니다.

가장 쉬운 해결 방법은 유효성 검사 주석을 암호 필드에서 제거하고 해당 필드를 컨트롤러에서 수동으로 유효성을 검사하는 것입니다. BindingResult 클래스에는 필드를 명시 적으로 유효하지 않은 것으로 표시 할 수있는 메소드가 있습니다.

또 다른 대안으로는 양식 클래스의 두 개의 하위 클래스 (각각 고유 한 암호 필드가있는 클래스, 유효성 검사 주석이있는 클래스 및없는 클래스)을 생성하여 적절한 위치에 적절한 하위 클래스를 사용하는 것입니다.

+0

JSR-303 Constraint Groups.http : //stackoverflow.com/a/36345405/1030527을 사용하는 솔루션 (현재는?)이 있습니다. – bernie

0

몇 개의 포인터. 나는 그들이 그래도 도움이 될 것입니다 확실하지 않다 :

Spring docs

그 말 :

당신이 컨트롤러의 @InitBinder 콜백 @ 2 내 binder.setValidator (검사기)를 호출 할 수 있습니다. 이것은 당신이 @Controller 클래스

javax.validation이 두 *Context 인터페이스 당 검사기 인스턴스를 구성 할 수 있습니다. 다른 컨텍스트에서 다른 유효성 검사를 수행 할 수 있는지 여부를 확인하려면 자세한 정보를 얻으십시오.

0

hasErrors() 함수 대신 hasFieldErrors (fieldname)를 사용하고 양식에 필요한 특정 필드의 유효성 만 검사하십시오.

2

이렇게하려면 JSR-303 constraint groups을 사용할 수 있습니다.컨트롤러에서 다음

public class User { 

    public interface GroupNewUser {}; 

    @NotEmpty 
    private String username; 

    @NotEmpty(groups = {GroupNewUser.class}); 
    private String password; 

    // ... 
} 

대신 @Valid를 사용하는 제약 그룹이 적용 지정 허용 봄의 @Validated 주석을 사용합니다.

자세한 내용은 this blog postthis one also을 참조하십시오.

이 또한 superb post for Spring usage입니다.