2017-12-02 11 views
0

私はOmniFacesのomnifaces.SelectItemsConverterを使用していますので、selectOneMenuにオブジェクトの文字列値を表示できます。検証が失敗するまではすべて正常に動作します(f:validateDoubleRange)。検証がうまくいかなくても、私が何をするかは関係ありません。私はselectOneMenuで示したオブジェクトのequalsメソッドでNullPointerExceptionを取得します。検証が失敗した場合のNullpointerexceptionコンバータを使用したJSF

これは、equalsメソッドです:

@Override 
public boolean equals(Object obj) { 
    Car other = (Car) obj; 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    if (!number.equals(other.number)) 
     return false; 
    return true; 
} 

私はOmniFaces'コンバータ

<h:selectOneMenu id="id_1" value="#{myBean.car}" converter="omnifaces.SelectItemsConverter"> 
    <f:selectItems value="#{myBean.cars}" /> 
</h:selectOneMenu> 

を使用して、これは私がNullPointerException

<h:inputText id="nom" value="#{myBean.num}" 
       style="height: 24px; "><f:validateDoubleRange minimum="0.0"/></h:inputText> 

の原因の検証である場所ですこの行の例外を取得してください:

if (!number.equals(other.number)) 

other.number OKですが、numberがnull

なぜthis.number nullはありますか?

+0

カスタムコンバータを使用しているときにこの問題は発生しないことを意味しています。これは真実ではありません。それに応じて再度質問をしてください。 – BalusC

+0

@BalusC私は、コンバータを使用しているときにこのエラーが発生していると言っているだけで、コンバータの故障ではないと言っているわけではありません。しかし、私が何を間違っているのかわからないので、私は解決策を探しています... – AwesomeGuy

答えて

0

根本原因

検証はビュー内の入力コンポーネントのいずれかに失敗した後、問題の根本的な原因は、入力コンポーネントの状態のJSFデフォルトの処理です。

これはこのaccepted answerで非常によく説明されています。

ソリューション

は、だからあなたの特定のケースでは、前述のように答えはことを示唆している、あなたは(h:selectOneMenuのための最も重要な)入力コンポーネントの状態をリセットし、プル/バッキングから値を更新するためにJSFに指示する必要があります検証後のBeanモデルは失敗します。

あなたはJSF 2.2とアップを使用している場合は、あなたがこの

<h:commandButton value="Submit" actionListener="#{myBean.onSubmit()}" > 
    <f:ajax execute=":form:nom :form:id_1" 
      render=":form:messages :form:id_1" 
      resetValues="true"/> 
</h:commandButton> 

UPDATEのように、例えば、それを行うことができます:をあなたは前JSF 2.2している場合、あなたはそれを行うことができますこれは

<h:commandButton value="Submit" actionListener="#{dtSelectionView.onSubmit()}"> 
     <p:ajax process="@form" update="@form" resetValues="true" /> 
</h:commandButton> 
0(及び再び溶液及び説明は Primefaces showcaseに、ならびに参照 accepted answerに見出すことができる)ように、例えば、Primefaces p:ajax使用

(ただし、この目的でのみPrimefaceをインポートすることはお勧めしませんが...this.number

nullである理由を実際の原因は、私はあなたが提出しようとした場合、検証は1回目で失敗した後、気づいた(そして、あなたが入力をリセットしない場合)、他の可能性を探るために

良いことですh:selectOneMenuの値)、以下のクラスのいくつかは、新しいCarオブジェクトがdefault constructorを呼び出す(そして、あなたのケースでnullに等しいデフォルト値にnumberプロパティを初期化する作成)

Severe: java.lang.NullPointerException 
    at entities.Car.equals(Car.java:107) 
    at javax.faces.component.UIInput.compareValues(UIInput.java:1224) 
    at javax.faces.component.UIInput.validate(UIInput.java:990) 
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1248) 
    at javax.faces.component.UIInput.processValidators(UIInput.java:712) 
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:575) 
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403) 
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:266) 
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57) 
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219) 
    at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:139) 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1193) 
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 

率直に言って、私はこの主題についての私の知識を超えているため、どこで、なぜこれが起こるのか説明できません。

+0

JSF 2.0を使用していますが、を使用してh:selectOneMenuの値をリセットするにはどうすればよいですか?そして私はそれをどこに置くべきですか?検証が失敗した場合、値をリセットする必要があります。 – AwesomeGuy

+0

Primefaces p:ajaxを使用して解答を更新しました。 –

+0

それは働いた!ありがとう! – AwesomeGuy

関連する問題