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 유효성 검증 주석은 작동합니다.
야생의 추측 - 주석을 설정에서 가져 오기 (또는 더 좋게 - 필드 자체로) 변경하면 아무 것도 변경되지 않습니까? – Deltharis
컨트롤러에 @Validation이 없으면 유효성 검사는 지속성/병합 수준에서만 수행됩니다. Facelet과 JSF에 익숙하지 않지만, 유효성 측면에서 Spring MVC와 비슷한 것이 있어야합니다. – pms
@pmp : @Validation? javax.validation.constraints에는 그런 것이 없습니다. 추신 나는 봄을 사용하지 않는다. –