2017-04-19 3 views
0

私は、すべてのp:ajaxイベントでバッキングBeanで管理されるエンティティインスタンスにJSFコンポーネント値を直接書きたいJava Web 7プロジェクトを持っています。エンティティプロパティの1つに@Size(min=5)のようなJSR 303の検証制約を追加していれば問題ありません。制約が違反されている限り、その値は制約付きのプロパティで設定されなくなります。 NetBeansデバッガに従ってsetterが呼び出されません。他の不動産はうまく働いて、私が問題を切り離したと信じさせてくれます。私が欲しいと思ったら検証を行い、私が望むなら無効な値セットを取得したいと思います。それを達成するには?JSR 303の検証制約に違反している場合、p:inputTextの値をp:ajaxで設定する方法を教えてください。

私はエンティティに 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

Hm、多分p:ajaxにイベントを追加すると、ドキュメントによると、デフォルトは "親ClientBehaviorHolderコンポーネントによって定義されていますが、その動作は"、どんなものであれ... ...でも、実際に検証注釈を追加すると、このデフォルトの変更が行われると思います。多分。 (とにかく誰もがjsfライフサイクルを理解していない)。 – slowy

+0

その後、私の名前はnobody – 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

これは、複製の回答のうちの1つに正確に含まれるものです...質問をそのようにマークしてください – Kukeltje

関連する問題