2013-02-23 25 views
5

とselectOneMenu私は最初のものは1オブジェクトを入力して含まれている2 <h:selectOneMenu/>時間:ユーザー定義オブジェクト

を実装しようとしています。 ユーザーがこのリストからオブジェクトを選択すると、 の2番目の<h:selectOneMenu/>が表示されます。

は、ここに私のコード

XHTML

<h:form> 
<h:selectOneMenu value="#{handler.selectedType1}" valueChangeListener="#{handler.valueChanged}"> 
    <f:selectItems value="#{handler.types1}" var="type1" itemValue="#{type1.name}" itemLabel="#{type1.name}" /> 
    <a4j:ajax event="valueChange" render="type2List" execute="@this"/> 
</h:selectOneMenu> 
<h:selectOneMenu id="type2List" value="#{handler.selectedType2}" rendered="#{not empty handler.selectedType2}"> 
    <f:selectItems value="#{handler.types2}" var="type2" itemLabel="#{type2.name}" /> 
</h:selectOneMenu> 
</h:form> 

は、タイプ1とタイプ2は、カスタムクラスにある豆

@ManagedBean 
@ViewScoped 
public class Handler { 

    private Type1 selectedType1; 
    private List<Type1> types1; 
    private Type2 selectedType2; 
    private List<Type2> types2; 

     //getters, setters 

     public void valueChanged(ValueChangeEvent event) { 
     variants.clear(); 
     if (event.getNewValue() != null) { 
      System.out.println("new value: " + event.getNewValue()); 
         // Fill the second list 
     } 
    } 
} 

を管理されています。それらのname属性は文字列です。

問題は、私が最初のリストから要素を選択したとき、私は私が最初のselect要素にvalueChangeListenerのプロパティは私のマネージドBeanメソッド「のvalueChanged」をトリガーしようとしていることを推測

24 févr. 2013 12:15:26 com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer getConvertedValue 
GRAVE: Could not instantiate converter for type class com.flightfaq.beans.business.AircraftType: java.lang.NullPointerException 
24 févr. 2013 12:15:26 com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer getConvertedValue 
GRAVE: 
java.lang.NullPointerException 
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:129) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:201) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:318) 
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030) 
    at javax.faces.component.UIInput.validate(UIInput.java:960) 
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1233) 
    at javax.faces.component.UIInput.processValidators(UIInput.java:698) 
    at org.richfaces.context.PartialViewExecuteVisitCallback.visit(PartialViewExecuteVisitCallback.java:55) 
    at org.richfaces.context.BaseExtendedVisitContext.invokeVisitCallback(BaseExtendedVisitContext.java:321) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1612) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) 
    at org.richfaces.context.ExtendedPartialViewContextImpl.executeComponents(ExtendedPartialViewContextImpl.java:237) 
    at org.richfaces.context.ExtendedPartialViewContextImpl.processPartialExecutePhase(ExtendedPartialViewContextImpl.java:217) 
    at org.richfaces.context.ExtendedPartialViewContextImpl.processPartial(ExtendedPartialViewContextImpl.java:196) 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1167) 
    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:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:680) 

を得るということです。しかし、それに達する前に停止しています(内部に何かが表示され、例外がスローされる前にJavaコンソールに表示されません)。

Type1とType2が文字列ではないという問題はありますか? これを修正するにはどうすればよいですか?


EDIT:

XHTML

<h:form> 
     <h:selectOneMenu value="#{missionHandler.selectedAircraftType}" converter="#{missionHandler.acTypeConverter}"> 
      <f:selectItems value="#{missionHandler.aircraftTypes}" var="type" itemValue="#{type}" itemLabel="#{type.typeOACI}" /> 
      <f:ajax listener="#{missionHandler.changeSelectedAircraftType}" render="variantsMenu"/> 
     </h:selectOneMenu> 
     <h:selectOneMenu id="variantsMenu" value="#{missionHandler.selectedVariant}" converter="#{missionHandler.variantConverter}"> 
      <f:selectItems value="#{missionHandler.variants}" var="variant" itemValue="#{variant}" itemLabel="#{variant.commercialName}" /> 
     </h:selectOneMenu> 
    </h:form> 

管理Bean

@ManagedBean 
@ViewScoped 
public class MissionHandler implements Serializable { 

    private static final long serialVersionUID = 2462652101518266609L; 

    private Mission mission; 

    @EJB 
    private AircraftTypeDao aircraftTypeDao; 

    @EJB 
    private VariantDao variantDao; 

    private AircraftType selectedAircraftType; 

    private List<AircraftType> aircraftTypes; 

    private Variant selectedVariant; 

    private List<Variant> variants; 

    private AircraftTypeConverter acTypeConverter; 

    private VariantConverter variantConverter; 

    public MissionHandler() { 
     /** Create an empty mission */ 
     mission = new Mission(); 
    } 

    @PostConstruct 
    public void init() { 
     aircraftTypes = aircraftTypeDao.findAll(); 
    } 


    public void changeSelectedAircraftType(AjaxBehaviorEvent event) { 
     System.out.println("Listener call"); 
     variants=variantDao.find(selectedAircraftType); 
     System.out.println("Listener out"); 
    } 
} 

コンバータ

@FacesConverter(forClass=AircraftType.class) 
public class AircraftTypeConverter implements Converter, Serializable { 

    private static final long serialVersionUID = 7053414108213420057L; 

    private final AircraftTypeDao aircraftDao = new AircraftTypeDaoImpl(); 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, 
      String value) { 
     System.out.println("convert to Object " + value); 
     AircraftType acType = aircraftDao.find(value); 
     System.out.println("got ac type " + acType.getTypeOACI()); 
     return acType; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, 
      Object value) { 
     System.out.println("convert to String " + value); 
     return ((AircraftType) value).getTypeOACI(); 
    } 

} 

@FacesConverter(forClass=Variant.class) 
public class VariantConverter implements Converter, Serializable { 

    private static final long serialVersionUID = 7053414108213420057L; 

    private final VariantDao variantDao = new VariantDaoImpl(); 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, 
      String value) { 
     System.out.println("convert to Object " + value); 
     Variant variant = variantDao.find(value); 
     System.out.println("got variant " + variant.getCommercialName()); 
     return variant; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, 
      Object value) { 
     System.out.println("convert to String " + value); 
     return ((Variant) value).getCommercialName(); 
    } 

} 
012:BalusCの答えの後に、これは私のコードです

- 航空機のタイプのリストはDB からロードされます - 1つを選択すると、それは文字列からAircraftType(変換器のおかげで)に変換されます それだけです。リスナーメソッドの呼び出し、および「バリアント」selectOneMenu

の更新なしなし私はまだあなたの助けを必要としません:)

+0

ここでは、数行だけでなく、スタックトレース全体を送信します。 – kolossus

答えて

6

短い答えを:あなたはJavaで使用するためAircrafTypeオブジェクト間の変換をConverterを作成する必要がありますHTML/HTTP側での使用にはユニークなStringがあります。

長い答え:慎重にConversion Error setting value for 'null Converter'Primefaces selectOneMenu listener not called with Objects other than Stringsを読んでください。

まだ完了していない場合はimplement equals() and hashCode()AircraftTypeに忘れないようにしてください。具体的な問題へ


無関係valueChangeListenerは、ジョブの間違ったツールです。代わりに<p:ajax listener>を使用してください。関連項目When to use valueChangeListener or f:ajax listener?およびHow to load second selectOneMenu on change of first selectOneMenu?

+0

こんにちはBalusC。あなたの答えをありがとうございます(いつものように、非常に参考になります)。しかし、私はまだ動作させるのに苦労しています。私の編集を参照してください。 – facewindu

+0

'equals()'と 'hashCode()'を正しく実装しましたか? 「検証エラー:値が無効です」というメッセージが表示されますか? ''を使用するか、サーバログを読み込みます。 – BalusC

+1

はい、もう一度ロックします:)私はequalsとhashCodeを実装しましたが、これは間違って行われました。私は内部のすべての非本質的なチェックを削除し、 "本当の"ビジネス属性に焦点を当てました。それは動作します:)ありがとう – facewindu

関連する問題