2014-09-12 2 views
0

Facelet의 Backing Bean이 setLastName("Test!!!")을 호출 할 때 비 알파 문자가 메소드 인수에 명확하게 존재하더라도 ConstraintViolationException이 발생하지 않습니다.JPA 엔티티가 병합 될 때까지 Bean 유효성 검증이 작동하지 않습니다.

setLastName이 호출되고 있고 JPA 엔티티의 lastName 값이 변경되었음을 확인하기 위해 중단 점을 설정했습니다. 유효성 검사는 즉시 실패해야합니다. 그렇지 않습니다.

나중에 변경 사항을 지속 할 때 EntityManager # merge가 호출 될 때 ConstraintViolationException이 발생합니다. 제약 조건 위반의

목록 : [ ConstraintViolationImpl {interpolatedMessage = 'error.spacesandletters', propertyPath =이 lastName, rootBeanClass = 클래스 foo.bar.business.model.entity.authenticate.User, messageTemplate = ' error.spacesandletters '}]

private String lastName; 

@Column(name="lastname", nullable=false, length=40) 
@Size(max=40) 
@NotNull 
@Basic(optional=false) 
@Pattern(regexp="[A-Za-z ]*", message="error.spacesandletters") 
public String getLastName() { return this.lastName; } 

public void setLastName(String lastName) { this.lastName = lastName; } 

는 그래서 확인이 가능하다는 것을 알고는 JPA에서 작동하는지 사전에 유지됩니다. 하지만 어떤 이유로 사용자 # setLastName이 먼저 백업 빈을 통해 호출되는 순간에는 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

수정 # 1 :

내 ChangePasswordBean는 다음과 같은 두 개의 사용자 정의 주석과 함께 잘 작동하는지 언급해야한다.

@NotEmpty @Password private String password1; 
@NotEmpty @Password private String password2; 

그러나이 경우 백업 빈의 필드는 주석 처리됩니다. 위의 예제에서 backing 빈은 getter가 주석 처리 된 JPA 엔티티를 가리키고 있습니다.

편집 # 2 :

this other question에 BalusC의 참조를 읽은 후에서 그는 문제가 내가 인 Mojarra 2.2.8-01로 업그레이드했습니다 known Mojarra bug that was fixed in v. 2.2.7과 관련이있을 수 있다는 생각을했다. 활성화 된 다음 JSF 구현 : [인 Mojarra 2.2 -

17 : 41 JBAS012615 51,965 INFO [org.jboss.as.jsf (38 ServerService 스레드 풀) 여기서 제이보스 시작 로그 엔트리이다 .8-01, main]

불행히도, 제가 설명했던 문제는 사라지지 않았습니다. JPA 엔티티의 Bean 유효성 검증 주석은 작동하지 않지만 JSF 관리 Bean의 bean 유효성 검증 주석은 작동합니다.

+0

야생의 추측 - 주석을 설정에서 가져 오기 (또는 더 좋게 - 필드 자체로) 변경하면 아무 것도 변경되지 않습니까? – Deltharis

+0

컨트롤러에 @Validation이 없으면 유효성 검사는 지속성/병합 수준에서만 수행됩니다. Facelet과 JSF에 익숙하지 않지만, 유효성 측면에서 Spring MVC와 비슷한 것이 있어야합니다. – pms

+0

@pmp : @Validation? javax.validation.constraints에는 그런 것이 없습니다. 추신 나는 봄을 사용하지 않는다. –

답변

1

올바른 동작입니다. JPA 이벤트 기반 유효성 검사에 의존하는 경우 유효성 검사는 사전 업데이트 이벤트에서 발생합니다. 단일 필드 변경시 트리거 할 수있는 라이프 사이클 이벤트가 없습니다. 실제로 이것은 계측 클래스에서만 작동합니다. 그렇지 않으면 값 설정을 가로채는 방법이 없기 때문입니다. 또한 빈 검증 (Bean Validation)은 전체 빈과 그 연관을 검증하는 프레임 워크의 핵심입니다. 그래서 API에 validateValuevalidateProperty이 있더라도 주 유효성 검사 루틴은 validate이며 이는 빈/객체를 매개 변수로 사용합니다.

유효성 검사 예, 바로 실패 :

그래서 귀하의 질문에 대답?

아니요.

세터 호출시 직접 유효성 검사가 필요합니까? 이를 수행하는 방법이 있지만 사용자 정의 코드를 작성하는 것이 포함되며 컴파일 또는 런타임 차단 프레임 워크를 사용해야합니다.

+0

예, 사용자가 단추를 클릭 할 때 유효성 검사가 필요합니다. 나중에 엔티티가 병합 될 때가 아니라 나중에 유효성 검사가 필요합니다. Backing 빈의 setter가 호출 될 때 ConstraintViolationException이 발생해야합니다. 이 모든 것이 내 다른 페이지에서 잘 작동합니다. 다른 점은이 특정 백킹 빈이 JPA 엔티티를 가리킨다는 것입니다. 따라서 backing 빈의 getter/setter는 엔티티 빈에서 getters/setter를 호출합니다. 엔티티 bean과 backing bean의 다른 세트에서 하나의 주석 세트를 사용해야한다는 말입니까? –

+0

추가 정보로 내 질문을 편집했습니다. 필드가 주석 처리 된 또 다른 backing 빈은 JPA를 가리키는 backing bean이 문제가있는 반면에 유효성을 검사한다. –

+0

OP가'[jsf]'태그를 사용하지 않았지만 OP가 Facelets를 사용했다고 분명히 말한 것을 이해합니다. JSF는 OP에서 예상 한대로 유효성 검사 단계에서 Bean 유효성 검사를 수행하는 기능을 기본적으로 지원합니다. 따라서 귀하의 대답은 근본적으로 잘못되어 귀하가 수정하거나 삭제해야합니다. – BalusC