當Facelet的後臺bean調用setLastName("Test!!!")
時,雖然非alpha字符清晰地出現在方法參數中,但沒有引發ConstraintViolationException。直到JPA實體合併爲止,Bean驗證不起作用
我設置了一個斷點來驗證setLastName被調用,我觀察到JPA實體的lastName值更改。驗證應該立即失敗,是嗎?不是。
稍後,當需要保存更改時,調用EntityManager#merge時,會引發ConstraintViolationException。
違反約束的列表:[ ConstraintViolationImpl {interpolatedMessage = 'error.spacesandletters', 的PropertyPath =姓氏,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首先通過支持bean調用。我究竟做錯了什麼?
編輯#1:
我應該提到,我ChangePasswordBean工作只是有以下兩個自定義註釋罰款。
@NotEmpty @Password private String password1;
@NotEmpty @Password private String password2;
但是在這種情況下,支持bean的字段被註釋。而在上面的示例中,支持bean指向其getter被註釋的JPA實體。
編輯#2:
閱讀BalusC的參考this other question後,他在想這個問題可能與一個known Mojarra bug that was fixed in v. 2.2.7我升級到鑽嘴魚科2.2.8-01。下面是在Wildfly啓動日誌條目:
17:41:51965 INFO [org.jboss.as.jsf(Server服務線程池 - 38)JBAS012615:激活以下JSF實現:鑽嘴魚科-2.2 .8-01,主]
不幸的是,我所描述的問題並沒有消失。 JPA實體上的Bean驗證註釋不起作用,而JSF託管bean上的bean驗證註釋正在工作。
只是一個瘋狂的猜測 - 將移動註釋從獲取設置(或更好 - 字段本身)改變任何東西? – Deltharis 2014-09-12 22:24:34
如果您的控制器中沒有@Validation,驗證只會發生在Persist/Merge級別。我對Facelet和JSF並不熟悉,但在驗證方面應該與Spring-MVC類似。 – pms 2014-09-13 00:01:09
@pmp:@Validation?沒有這樣的事情在javax.validation.constraints。附:我沒有使用Spring。 – 2014-09-13 02:39:06