2017-04-19 51 views
0

我有一個Java Web 7項目,我想在每個p:ajax事件上直接在支持bean中管理的實體實例上編寫JSF組件值。只要我在其中一個實體屬性上添加JSR 303驗證約束(如@Size(min=5)),就可以正常工作。只要約束被違反,該值就不會在具有約束的屬性上設置。根據NetBeans調試器不會調用setter;另一個屬性工作得很好,這導致我相信我已經隔離了這個問題。我想要在我想要的時候執行驗證,因此如果需要,可以設置無效值。如何實現這一目標?如果違反JSR 303驗證約束,如何強制通過p:ajax設置p:inputText值?

在我最小的重複的例子,我有實體MyEntity(JPA和JSR 303個註解)

 
@Entity 
public class MyEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue 
    private Long id; 
    @Size(min = 5) 
    private String property1; 
    private String property2; 

    public MyEntity() { 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getProperty1() { 
     return property1; 
    } 

    public void setProperty1(String property1) { 
     this.property1 = property1; 
    } 

    public String getProperty2() { 
     return property2; 
    } 

    public void setProperty2(String property2) { 
     this.property2 = property2; 
    } 
} 

JSF頁面

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 
    <h:head> 
     <title>Facelet Title</title> 
    </h:head> 
    <h:body> 
     <h:form> 
      <p:inputText value="#{myManagedBean.myEntity.property1}"> 
       <p:ajax/> 
      </p:inputText> 
      <p:inputTextarea value="#{myManagedBean.myEntity.property2}"> 
       <p:ajax/> 
      </p:inputTextarea> 
      <p:commandButton value="Save"> 
       <p:ajax listener="#{myManagedBean.onSaveButtonClicked}"/> 
      </p:commandButton> 
     </h:form> 
    </h:body> 
</html> 

和支持bean

 
@ManagedBean 
@SessionScoped 
public class MyManagedBean { 
    private String value; 
    private String textAreaValue; 
    private MyEntity myEntity = new MyEntity(); 

    public MyManagedBean() { 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public String getTextAreaValue() { 
     return textAreaValue; 
    } 

    public MyEntity getMyEntity() { 
     return myEntity; 
    } 

    public void setMyEntity(MyEntity myEntity) { 
     this.myEntity = myEntity; 
    } 

    public void setTextAreaValue(String textAreaValue) { 
     this.textAreaValue = textAreaValue; 
    } 

    public void onSaveButtonClicked(AjaxBehaviorEvent event) { 
     System.out.println("value: "+value); 
     System.out.println("textAreaValue: "+textAreaValue); 
     System.out.println("myEntity: "+myEntity); 
    } 
} 

的例子可以在https://github.com/krichter722/jsf-skip-entity-validation找到。我正在使用Primefaces 6.0。

+0

嗯,也許如果你添加一個事件到p:ajax?根據文檔,默認的「由父級ClientBehaviorHolder組件來定義行爲」,無論是什麼地獄......但我認爲這個默認的變化,當你實際添加驗證註釋。也許。 (無論如何,沒有人理解JSF生命週期的事情)。 – slowy

+0

然後我的名字是沒有人 – Kukeltje

+2

[JSF 2.0:如何跳過JSR-303 bean驗證?](http://stackoverflow.com/questions/4852496/jsf-2-0-how-to-skip-jsr -303-bean-validation) – Kukeltje

回答

1

它正在工作,因爲它應該工作。如果驗證失敗,則不應調用setter。如果你想要,你可以禁用bean驗證:

<f:validateBean disabled="true"/> 
+1

這就是重複中的(其中之一)答案...請將問題標記爲 – Kukeltje