2013-02-23 22 views
5

साथ selectOneMenu मैं लागू करने के लिए दो <h:selectOneMenu/>ज: उपयोगकर्ता परिभाषित वस्तु

पहले एक 1 ऑब्जेक्ट प्रकार होता है कोशिश कर रहा हूँ। जब उपयोगकर्ता इस सूची से कोई ऑब्जेक्ट चुनता है, तो दूसरा <h:selectOneMenu/> प्रदर्शित किया जाएगा।

यहाँ मेरी कोड

एक्सएचटीएमएल

<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> 

कामयाब सेम

@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 
     } 
    } 
} 

टाइप 1 और Type2 कस्टम वर्गों के लिए कर रहे हैं। उनका नाम विशेषता एक स्ट्रिंग है।

समस्या यह है कि जब मैं पहली बार सूची में से एक तत्व का चयन, मैं

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) 

मिल मुझे लगता है कि पहले का चयन तत्व पर valueChangeListener संपत्ति अपने प्रबंधित सेम विधि "valueChanged" को गति प्रदान करने की कोशिश करता है। लेकिन इसे पहुंचने से पहले इसे रोक दिया गया है (मैंने अंदर कुछ मुद्रित किया है, और यह अपवाद फेंकने से पहले जावा कंसोल में नहीं दिखाया गया है)

क्या इस तथ्य से संबंधित समस्या है कि टाइप 1 और टाइप 2 स्ट्रिंग्स नहीं हैं? मैं इसे कैसे ठीक कर सकता हूं?


संपादित करें: BalusC के जवाब के बाद यह मेरा कोड है:

एक्सएचटीएमएल

<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> 

कामयाब सेम

@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(); 
    } 

} 

मुझे इस कोड को निष्पादित करें: - विमान प्रकारों की सूची correclty डीबी से भरी हुई है - जब मैं एक का चयन करें, यह correclty AircraftType (कनवर्टर करने के लिए धन्यवाद) को स्ट्रिंग से बदल जाती है, लेकिन इतना ही है। श्रोता विधि के लिए कोई कॉल, और "संस्करण" selectOneMenu

का कोई अद्यतन

मैं अभी भी आपकी मदद की जरूरत है :)

+0

यहां केवल कुछ लाइनों पर नहीं, पूरे स्टैक ट्रेस को पोस्ट करें। – kolossus

उत्तर

6

लघु जवाब: यदि आप एक Converter जो जावा में उपयोग के लिए एक AircrafType वस्तु के बीच धर्मान्तरित बनाने की जरूरत एचटीएमएल/एचटीएमएल पक्ष में उपयोग के लिए पक्ष और एक अद्वितीय 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

हैलो बलुस। आपके उत्तर के लिए धन्यवाद (हमेशा के रूप में यह बहुत उपयोगी और अच्छी तरह से दस्तावेज है)। लेकिन मैं अभी भी इसे काम करने के लिए संघर्ष कर रहा हूं, मेरा संपादन – facewindu

+0

देखें क्या आपने ठीक से 'बराबर() 'और' हैशकोड() 'लागू किया है? क्या आपको "सत्यापन त्रुटि: मान मान्य नहीं है"? '' या सर्वर लॉग पढ़ें। – BalusC

+1

हां, एक बार फिर आप चट्टान :) मैंने बराबर और हैशकोड लागू किया लेकिन यह गलत तरीके से किया गया था। मैंने अंदर सभी गैर आवश्यक चेक को हटा दिया और "असली" व्यावसायिक विशेषताओं पर ध्यान केंद्रित किया। यह काम करता है :) धन्यवाद – facewindu