Javax.el.PropertyNotFoundException को पहचानना और हल करना: लक्ष्यहीन होना


127

जब ईएल में एक प्रबंधित बीन को संदर्भित करने की कोशिश की जाती है, तो #{bean.entity.property}कभी-कभी एक javax.el.PropertyNotFoundException: Target Unreachableअपवाद को फेंक दिया जाता है, आमतौर पर जब एक बीन संपत्ति सेट की जानी होती है, या जब बीन की कार्रवाई को लागू करना होता है।

पांच अलग-अलग प्रकार के संदेश प्रतीत होते हैं:

  1. लक्ष्यहीन, पहचान योग्य 'बीन' अशक्त करने का संकल्प लिया
  2. लक्ष्यहीन, 'इकाई' निरर्थक है
  3. लक्ष्यहीन, 'अशक्त' अशक्त लौट आया
  4. लक्ष्यहीन, '' 0 '' शून्य हो गया
  5. लक्ष्यहीन, 'ब्रैकेटसफिक्स' निरर्थक हो गया

उन सब का क्या मतलब था? वे कैसे कारण हैं और उन्हें कैसे हल किया जाना चाहिए?


वेबलॉग का उपयोग करने वालों के लिए, इस लिंक को आज़माएँ। /programming/45422943/why-is-target-unreachable-identifier-resolved-to-null-on-weblogic/45490295#45490295
DenisMP

वसंत और वेबलॉग का उपयोग करने वालों के लिए, इस लिंक को देखने का प्रयास करें। /programming/45422943/why-is-target-unreachable-identifier-resolved-to-null-on-weblogic?noredirect=1#comment77848030_45422943
DenisMP

अचानक, यह मेरे लिए टूट गया ... मैंने सर्वर को रोककर, javax.faces.jar (Mojarra) को हटाकर, मेरी बिल्ड निर्देशिका को हटा दिया और मेरे WebLogic सर्वर के \ tmp \ _ को साफ करके इसे ठीक कर दिया। डोमेन में और \ कैश \ फ़ोल्डर, सर्वर को फिर से शुरू करने, प्रकाशित करने का प्रयास कर रहा है और इसे विफल होने के कारण यह javax, SVN-reverting javax.faces.jar विलोपन नहीं मिल सकता है (ताकि आप बस इसे बाहर ले जा सकें और फिर) इसे वापस ले जाएं), और प्रकाशन। अचानक, यह फिर से काम किया ...
एंड्रयू

हमेशा प्रासंगिक लॉग संदेशों की तैनाती के लिए ऊपर कुछ पंक्तियों की जांच करें, यहां यह वास्तविक मूल कारण था: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]और कहा कि बीन ( FinancialAdminReceiptWebRequestBean) nullसुनिश्चित करने के लिए नहीं मिला और हल किया जा सकता है। एक अन्य सामान्य गलती है, जैसे कि नाम बदलने या चलती कक्षाओं / इंटरफेस (या भूल clean) के बाद एप्लिकेशन सर्वर को पुनरारंभ नहीं करना ।
रोलैंड

जवाबों:


238

1. लक्ष्यहीन, पहचान योग्य 'बीन' अशक्त करने का संकल्प लिया

यह इस बात से उबलता है कि प्रबंधित बीन का उदाहरण स्वयं उस पहचानकर्ता (ईएलएन बीन नाम) द्वारा ईएल में नहीं पाया जा सकता है जैसे कि #{bean}

कारण की पहचान को तीन चरणों में तोड़ा जा सकता है:

ए। सेम का प्रबंधन कौन कर रहा है?
ख। (डिफ़ॉल्ट) प्रबंधित बीन नाम क्या है?
सी। बैकिंग बीन क्लास कहाँ है?

1 क। सेम का प्रबंधन कौन कर रहा है?

पहला कदम यह जाँचना होगा कि बीन के प्रबंधन के लिए कौन सा सेम प्रबंधन ढांचा जिम्मेदार है। यह JSF के माध्यम से है @ManagedBean? या यह सीडीआई के माध्यम से है @Named? या यह वसंत के माध्यम से है @Component? क्या आप यह सुनिश्चित कर सकते हैं कि आप कई सेम प्रबंधन ढांचे विशिष्ट एनोटेशन को एक ही बैकिंग बीन क्लास पर नहीं मिला रहे हैं? जैसे @Named @Component, या @Named @ManagedBean, या @ManagedBean @Component। ये गलत है। बीन को अधिकतम एक बीन प्रबंधन ढांचे द्वारा प्रबंधित किया जाना चाहिए और उस ढांचे को ठीक से कॉन्फ़िगर किया जाना चाहिए। यदि आपको पहले से ही पता नहीं है कि किसे चुनना है, तो हेड टू बैकिंग बीन्स (@ManagedBean) या CDI बीन्स (@ नाम)? और स्प्रिंग जेएसएफ एकीकरण: जेएसएफ प्रबंधित बीन में स्प्रिंग घटक / सेवा को कैसे इंजेक्ट किया जाए?

यदि यह JSF है जो सेम के माध्यम से प्रबंधन कर रहा है @ManagedBean, तो आपको निम्नलिखित सुनिश्चित करने की आवश्यकता है:

  • faces-config.xmlजड़ घोषणा JSF 2.0 के साथ संगत है। तो XSD फ़ाइल और कम से कम JSF 2.0 या उच्चतर निर्दिष्ट versionकरना चाहिए और इस प्रकार 1.x नहीं।

    <faces-config
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
        version="2.0">

    JSF 2.1 के लिए, बस की जगह 2_0और 2.0से 2_1और 2.1क्रमशः।

    यदि आप JSF 2.2 या उच्चतर पर हैं, तो सुनिश्चित करें कि आप सभी स्थानों पर xmlns.jcp.orgनाम स्थान का उपयोग कर रहे हैं java.sun.com

    <faces-config
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">

    JSF 2.3 के लिए, बस की जगह 2_2और 2.2से 2_3और 2.3क्रमशः।

  • आप गलती से आयात नहीं किया javax.annotation.ManagedBeanबजाय javax.faces.bean.ManagedBean। आईडीई स्वतः पूर्ण के साथ देखें, ग्रहण को सूची में पहले आइटम के रूप में गलत तरीके से स्वचालित रूप से जाना जाता है।

  • आपने एक अलग प्रबंधित बीन नाम के साथ एक ही बैकिंग बीन क्लास पर @ManagedBeanJSF 1.x शैली <managed-bean>प्रविष्टि द्वारा ओवरराइड नहीं किया faces-config.xml। इस पर एक पूर्वता होगी @ManagedBeanfaces-config.xmlJSF 2.0 के बाद से प्रबंधित बीन का पंजीकरण आवश्यक नहीं है, बस इसे हटा दें।
  • JSF API संबंधित JAR में आपका रनटाइम क्लासपाथ स्वच्छ और डुप्लिकेट से मुक्त है। सुनिश्चित करें कि आप कई JSF कार्यान्वयन (Mojarra और MyFaces) का मिश्रण नहीं कर रहे हैं। सुनिश्चित करें कि आप एक और JSF या यहाँ तक कि Java EE API JAR फ़ाइल को वेबएप पर उपलब्ध नहीं कराते हैं जब लक्ष्य कंटेनर पहले ही JSF API को बॉक्स से बाहर कर देता है। जेएसएफ इंस्टॉलेशन निर्देशों के लिए हमारे जेएसएफ विकी पेज का " इंस्टॉलेशन जेएसएफ" अनुभाग भी देखें । यदि आप कंटेनर-बंडल किए गए JSF को WAR से कंटेनर के बजाय स्वयं ही अपग्रेड करना चाहते हैं, तो सुनिश्चित करें कि आपने लक्ष्य कंटेनर को WAR- बंडल JSF API / impl का उपयोग करने का निर्देश दिया है।
  • यदि आप एक JAR में JSF प्रबंधित बीन्स की पैकेजिंग कर रहे हैं, तो सुनिश्चित करें कि JAR में कम से कम JSF 2.0 संगत है /META-INF/faces-config.xml। यह भी देखें कि जेएसएफ प्रबंधित बीन्स को कैसे संदर्भित करें जो एक जार फ़ाइल में प्रदान किए गए हैं?
  • आप कर रहे हैं वास्तव में जुरासिक JSF 1.x का उपयोग कर, और आप अपग्रेड नहीं कर सकते, तो आप के माध्यम से सेम रजिस्टर करने की आवश्यकता <managed-bean>में faces-config.xmlके बजाय @ManagedBean। अपने प्रोजेक्ट बिल्ड पथ को ठीक करने के लिए मत भूलें जैसे कि आपके पास JSF 2.x लाइब्रेरी अब और नहीं है (ताकि @ManagedBeanएनोटेशन भ्रमपूर्ण रूप से सफलतापूर्वक संकलित न हो)।


यदि यह CDI है, जो सेम के माध्यम से प्रबंधन कर रहा है @Named, तो आपको निम्नलिखित सुनिश्चित करने की आवश्यकता है:

  • CDI 1.0 (Java EE 6) को /WEB-INF/beans.xmlWAR में CDI को सक्षम करने के लिए एक फ़ाइल की आवश्यकता होती है । यह खाली हो सकता है या इसमें केवल निम्नलिखित सामग्री हो सकती है:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    </beans>
  • CDI 1.1 (Java EE 7) बिना किसी beans.xmlया खाली beans.xmlफाइल के, या उपरोक्त CDI 1.0 संगत CDI 1.0 beans.xmlके समान व्यवहार करेगा। वहाँ जब एक CDI 1.1 संगत beans.xmlएक स्पष्ट साथ version="1.1", तो यह डिफ़ॉल्ट रूप से केवल पंजीकृत करेंगे @Namedसेम के साथ एक स्पष्ट CDI गुंजाइश टिप्पणी के रूप में इस तरह के @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScoped, आदि मामले में आप सब सेम रजिस्टर करने के लिए के रूप में CDI कामयाब सेम इरादा रखते हैं, यहां तक कि उन में कोई स्पष्ट बिना CDI गुंजाइश, सेट के /WEB-INF/beans.xmlसाथ संगत CDI 1.1 का उपयोग करें bean-discovery-mode="all"(डिफ़ॉल्ट है bean-discovery-mode="annotated")।

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                               http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
           version="1.1" bean-discovery-mode="all">
    </beans>
  • CDI 1.1+ के साथ bean-discovery-mode="annotated"(डिफ़ॉल्ट) का उपयोग करते समय , सुनिश्चित करें कि आपने गलती से एक JSF स्कोप आयात नहीं किया था जैसे कि javax.faces.bean.RequestScopedCDI स्कोप javax.enterprise.context.RequestScoped। आईडीई स्वत: पूर्ण के साथ देखें।

  • जब Mojarra 2.3.0-2.3.2 और CDI 1.1+ bean-discovery-mode="annotated"(डिफ़ॉल्ट) का उपयोग कर रहे हैं, तो आपको एक बग के कारण Mojarra को 2.3.3 या नए में अपग्रेड करने की आवश्यकता है । यदि आप अपग्रेड नहीं कर सकते हैं, तो आपको या तो सेट करने की जरूरत bean-discovery-mode="all"है beans.xml, या जेएसएफ 2.3 विशिष्ट @FacesConfigएनोटेशन को डब्ल्यूएआर में एक अनियंत्रित वर्ग पर डालने की जरूरत है (आमतौर पर किसी तरह का एक एप्लिकेशन स्कोप्ड स्टार्टअप क्लास)।
  • गैर-जावा ईई कंटेनर जैसे टॉमकैट और जेट्टी सीडीआई बंडल के साथ जहाज नहीं करता है। आपको इसे मैन्युअल रूप से इंस्टॉल करने की आवश्यकता है। यह सिर्फ लाइब्रेरी JAR (एस) को जोड़ने की तुलना में थोड़ा अधिक काम है। टॉमकैट के लिए, सुनिश्चित करें कि आप इस उत्तर में दिए गए निर्देशों का पालन करते हैं: टॉमकैट पर सीडीआई कैसे स्थापित और उपयोग करें?
  • CDI API संबंधित JAR में आपका रनटाइम क्लासपाथ स्वच्छ और डुप्लिकेट से मुक्त है। सुनिश्चित करें कि आप कई CDI कार्यान्वयन (वेल्ड, OpenWebBeans, आदि) का मिश्रण नहीं कर रहे हैं। सुनिश्चित करें कि आप किसी अन्य CDI या यहां तक ​​कि Java EE API JAR फ़ाइल को वेबैप के साथ प्रदान नहीं करते हैं जब लक्ष्य कंटेनर पहले से ही CDI API को बॉक्स से बाहर कर देता है।
  • यदि आप एक JAR में JSF विचारों के लिए CDI प्रबंधित बीन्स की पैकेजिंग कर रहे हैं, तो सुनिश्चित करें कि JAR में कम से कम एक वैध /META-INF/beans.xml(जिसे खाली रखा जा सकता है)।


मामले में यह स्प्रिंग है जो सेम के माध्यम से प्रबंध कर रहा है@Component , तो आपको निम्नलिखित के बारे में सुनिश्चित करने की आवश्यकता है:

  • वसंत को इसके प्रलेखन के अनुसार स्थापित और एकीकृत किया जा रहा है । महत्वपूर्ण रूप से, आपको कम से कम यह करने की आवश्यकता है web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    और इसमें faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (उपरोक्त सभी मैं वसंत के संबंध में जानता हूं - मैं वसंत नहीं करता - अन्य संभावित वसंत संबंधित कारणों के साथ संपादित / टिप्पणी करने के लिए स्वतंत्र महसूस करता हूं; उदाहरण के लिए कुछ XML कॉन्फ़िगरेशन से संबंधित परेशानी)


मामले में यह एक है पुनरावर्तक घटक जो अपने के माध्यम से (नेस्ट) सेम प्रबंधित कर रहा है varविशेषता (जैसे <h:dataTable var="item">, <ui:repeat var="item">,<p:tabView var="item"> , आदि) और आप वास्तव में मिला एक "लक्ष्य नहीं पहुंचा जा सकता, पहचानकर्ता 'आइटम' अशक्त का संकल्प", तो आप निम्न में से सुनिश्चित करने की आवश्यकता :

  • #{item}में संदर्भित नहीं है bindingकिसी भी बच्चे घटक के attribtue। यह गलत है क्योंकि bindingविशेषता व्यू बिल्ड टाइम के दौरान चलती है, व्यू रेंडर समय के दौरान नहीं। इसके अलावा, घटक के पेड़ में शारीरिक रूप से केवल एक घटक होता है जिसे बस हर पुनरावृत्ति दौर के दौरान पुन: उपयोग किया जाता है। दूसरे शब्दों में, आपको वास्तव में binding="#{bean.component}"इसके बजाय का उपयोग करना चाहिए binding="#{item.component}"। लेकिन बेहतर यह है कि आप इस तरह से हल करने के लिए सोची गई समस्या के लिए कंपोनेंट बीनिंग से पूरी तरह से छुटकारा पाएं और जांच करें / उचित दृष्टिकोण पूछें। यह भी देखें कि JSF में 'बाइंडिंग' विशेषता कैसे काम करती है? इसका उपयोग कब और कैसे किया जाना चाहिए?


1b। (डिफ़ॉल्ट) प्रबंधित बीन नाम क्या है?

दूसरा चरण पंजीकृत प्रबंधित बीन नाम की जाँच करना होगा। जेएसएफ और स्प्रिंग उपयोग कन्वेंशन जावाबीन्स विनिर्देशन के अनुरूप हैं जबकि सीडीआई में सीडीआई इम्प्लांट / संस्करण के आधार पर अपवाद हैं।

  • FooBeanनीचे की तरह एक बैकिंग बीन क्लास,

    @Named
    public class FooBean {}

    सभी बीन प्रबंधन ढांचे में #{fooBean}JavaBeans विनिर्देश के अनुसार एक डिफ़ॉल्ट प्रबंधित बीन नाम होगा ।

  • FOOBeanनीचे की तरह एक बैकिंग बीन क्लास,

    @Named
    public class FOOBean {}

    जिसका अयोग्य क्लासनाम जेएसएफ में कम से कम दो राजधानियों के साथ शुरू होता है और स्प्रिंग में एक अयोग्य श्रेणी के नाम का डिफ़ॉल्ट प्रबंधित बीन नाम होता है #{FOOBean}, जो जावाबीन्स की विशिष्टता के अनुरूप होता है। CDI में, यह जून 2015 से पहले जारी किए गए वेल्ड संस्करणों में भी है, लेकिन जून 2015 के बाद जारी किए गए वेल्ड संस्करणों में नहीं (2.2.14 / 2.3.0.B1 / 3.0.0.A9) और OpenWebBeans में निरीक्षण के कारण सीडीआई कल्पना । उन वेल्ड संस्करणों में और सभी OWB संस्करणों में यह केवल पहले अक्षर के साथ है #{fOOBean}

  • यदि आपने स्पष्ट रूप से fooनीचे की तरह एक प्रबंधित बीन नाम निर्दिष्ट किया है ,

    @Named("foo")
    public class FooBean {}

    या समतुल्य रूप से @ManagedBean(name="foo")या @Component("foo"), तो यह केवल द्वारा उपलब्ध हो जाएगा #{foo}इस प्रकार और नहीं द्वारा #{fooBean}


1c। बैकिंग बीन क्लास कहाँ है?

तीसरा कदम दोहरीकरण होगा यदि बैकिंग बीन क्लास निर्मित और तैनात WAR फ़ाइल में सही स्थान पर है। सुनिश्चित करें कि आपने प्रोजेक्ट पूरी तरह से पूरी तरह से स्वच्छ, पुनर्निर्माण, पुनर्विकास और पुनः आरंभ किया है और यदि आप वास्तव में कोड लिखने में व्यस्त थे और अधीर रूप से ब्राउज़र में F5 दबा रहे थे। यदि अभी भी व्यर्थ है, तो बिल्ड सिस्टम को एक WAR फ़ाइल का उत्पादन करने दें, जिसे आप तब निकालें और एक ज़िप टूल के साथ निरीक्षण करें। .classबैकिंग बीन क्लास की संकलित फ़ाइल को इसके पैकेज संरचना में रहना चाहिए /WEB-INF/classes। या, जब इसे JAR मॉड्यूल के हिस्से के रूप में पैक किया जाता है, तो संकलित .classफ़ाइल वाले JAR में निवास करना चाहिए /WEB-INF/libऔर इस तरह EAR के /libया कहीं और नहीं।

यदि आप ग्रहण का उपयोग कर रहे हैं, तो सुनिश्चित करें कि बैकिंग बीन क्लास में है srcऔर इस प्रकार नहीं WebContent , और सुनिश्चित करें कि प्रोजेक्ट> बिल्ड ऑटोमैटिकली सक्षम है। आप Maven उपयोग कर रहे हैं, कि समर्थन सेम कक्षा में है यह सुनिश्चित कर लें src/main/javaऔर इस तरह नहीं में src/main/resourcesया src/main/webapp

यदि आप EJB + WAR (s) के साथ एक EAR के भाग के रूप में वेब एप्लिकेशन को पैकेजिंग कर रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि बैकिंग बीन क्लासेस WAR मॉड्यूल में हैं और इस प्रकार EAR मॉड्यूल या EJB मॉड्यूल में नहीं हैं। बिजनेस टियर (EJB) किसी भी वेब टियर (WAR) से संबंधित कलाकृतियों से मुक्त होना चाहिए, ताकि बिजनेस टियर कई अलग-अलग वेब टियर्स (JSF, JAX-RS, JSP / सर्वलेट, आदि) में पुन: प्रयोज्य हो।


2. लक्ष्यरहित, 'इकाई' निरर्थक है

यह उस नेस्टेड प्रॉपर्टी entityको उबाल देता है जैसा कि #{bean.entity.property}लौटाया गया था null। यह आमतौर पर केवल तभी सामने आता है जब JSF को नीचे की तरह इनपुट घटक के माध्यम से मान सेट करना propertyहोता है, जबकि #{bean.entity}वास्तव में वापस आ जाता है null

<h:inputText value="#{bean.entity.property}" />

आपको यह सुनिश्चित करने की आवश्यकता है कि आपने मॉडल इकाई को पहले से तैयार कर लिया है @PostConstruct, या <f:viewAction>विधि में, या शायद एक add()एक्शन विधि के मामले में आप CRUD सूचियों और / या एक ही दृश्य पर संवाद के साथ काम कर रहे हैं।

@Named
@ViewScoped
public class Bean {

    private Entity entity; // +getter (setter is not necessary).

    @Inject
    private EntityService entityService;

    @PostConstruct
    public void init() {
        // In case you're updating an existing entity.
        entity = entityService.getById(entityId);

        // Or in case you want to create a new entity.
        entity = new Entity();
    }

    // ...
}

के महत्व के रूप में @PostConstruct; यदि आप एक सेम प्रबंधन ढांचे का उपयोग कर रहे हैं जो सीडीआई जैसे प्रॉक्सी का उपयोग करता है , तो एक नियमित निर्माणकर्ता में ऐसा करना विफल होगा । हमेशा @PostConstructप्रबंधित बीन @PreDestroyइंस्टॉलेशन पर हुक करने के लिए उपयोग करें (और प्रबंधित बीन इंस्टेंस विनाश पर हुक करने के लिए उपयोग करें)। इसके अतिरिक्त, एक कंस्ट्रक्टर में आपके पास अभी तक किसी भी इंजेक्ट की गई निर्भरता तक पहुंच नहीं होगी, यह भी देखें कि NullPointerException कंस्ट्रक्टर में @ इंजेक्ट बीन को एक्सेस करने की कोशिश कर रहा है

यदि इसके entityIdमाध्यम से आपूर्ति की जाती है <f:viewParam>, तो आपको <f:viewAction>इसके बजाय उपयोग करने की आवश्यकता होगी @PostConstruct। यह भी देखें कि कब उपयोग करें f: viewAction / preRenderView बनाम PostConstruct?

आपको यह सुनिश्चित करने की भी ज़रूरत है कि nullयदि आप इसे केवल एक add()एक्शन विधि में बना रहे हैं, तो पोस्टबैक के दौरान आप गैर- मॉडल को संरक्षित करते हैं । सबसे आसान होगा सेम को व्यू स्कोप में रखना। यह भी देखें कि सही बीन गुंजाइश कैसे चुनें?


3. लक्ष्यहीन, 'अशक्त' अशक्त लौट आया

यह वास्तव में # 2 के रूप में एक ही कारण है, केवल (पुराने) ईएल कार्यान्वयन का उपयोग किया जा रहा है कुछ अपवाद संदेश में प्रदर्शित करने के लिए संपत्ति के नाम को संरक्षित करने में छोटी गाड़ी है, जिसे अंततः 'अशक्त' के रूप में गलत तरीके से उजागर किया गया है। यह केवल डिबगिंग बनाता है और थोड़ा मुश्किल को ठीक करता है जब आप कुछ नेस्टेड गुणों को पसंद करते हैं #{bean.entity.subentity.subsubentity.property}

समाधान अभी भी समान है: सुनिश्चित करें कि प्रश्न में नेस्टेड इकाई nullसभी स्तरों में नहीं है।


4. लक्ष्यहीन, '' 0 '' शून्य हो गया

यह भी # 2 के समान कारण है, केवल (पुराने) ईएल कार्यान्वयन का उपयोग अपवाद संदेश तैयार करने में छोटी गाड़ी है। यह केवल तभी प्रकट होता है जब आप []EL में ब्रेस नोटेशन का उपयोग करते हैं , #{bean.collection[index]}जहां #{bean.collection}स्वयं नॉन-नल है, लेकिन निर्दिष्ट इंडेक्स में आइटम मौजूद नहीं है। इस तरह के संदेश की तब व्याख्या की जानी चाहिए:

लक्ष्यहीन, 'संग्रह [0]' शून्य हो गया

समाधान भी # 2 के समान है: सुनिश्चित करें कि संग्रह आइटम उपलब्ध है।


5. लक्ष्यहीन, 'ब्रैकेटसफिक्स' शून्य हो गया

यह वास्तव में # 4 के रूप में एक ही कारण है, केवल (पुराने) ईएल कार्यान्वयन का उपयोग अपवाद संदेश में प्रदर्शित करने के लिए पुनरावृत्ति सूचकांक को संरक्षित करने में कुछ छोटी है, जो अंततः 'ब्रैकेटसफिक्स' के रूप में गलत तरीके से उजागर हुआ है जो वास्तव में चरित्र है ]। यह केवल डिबगिंग बनाता है और संग्रह में एक से अधिक आइटम होने पर थोड़ा कठिन होता है।


अन्य संभावित कारण javax.el.PropertyNotFoundException:


मैं नंबर 3 में चल रहा हूं। #{bean.entity.property}आउटपुट को वैल्यू करता है लेकिन <p:selectBooleanCheckbox value="#{bean.entity.property}"/>फेल हो जाता है। मेरे बूलियन में एक सेटर है। इनपुट फ़ील्ड में उपयोग किए जाने पर उसी इकाई पर पूर्णांक संपत्ति काम करती है । कोई विचार?
जैस्पर डे व्रज

जाँच के लायक एक और बात यह सुनिश्चित करने के लिए है कि आपका JSF और CDI कार्यान्वयन एकीकृत है, जो मेरी समस्या थी: stackoverflow.com/questions/44064995/…
जैरी बी। नंबर 1 इंटर्न

के अनुसार: Target Unreachable, identifier 'bean' resolved to nullमल्टी मॉड्यूल मावेन परियोजनाओं में (ejb, वेब, कान के लिए मॉड्यूल युक्त) सुनिश्चित करें कि आपका वेब-मॉड्यूल आपके ईजेबी-मॉड्यूल पर निर्भरता की घोषणा करता है। इसके बिना @ManagedBeanJSF2.0 का उपयोग करके हल नहीं किया जा सकता है और आपको उन्हें घोषित करना होगा faces-config.xml। मुझे दो घंटे देख कि मैं एक निर्भरता घोषित नहीं किया था (मेरे कान में केवल था EJB और वेब) अपने वेब-मॉड्यूल में EJB शामिल करने के लिए चारों ओर ले गया
bish

1
@ManagedBeanवर्ग की तरह @bish फ्रंट-एंड कलाकृतियों में पहले स्थान पर सर्विस लेयर (EJB प्रोजेक्ट) नहीं है। यह भी देखें stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

बीन को सीरियस नहीं किया जा सकता था, इस त्रुटि के परिणामस्वरूप (जैसा कि मुझे संदेह है कि stackoverflow.com/questions/47533584/… में मामला है, लेकिन वर्तमान में खुद को आज़मा नहीं सकते)
Kukeltje

6

उन लोगों के लिए जो अभी भी अटके हुए हैं ...

CDI के साथ NetBeans 8.1 और GlassFish 4.1 का उपयोग करना, किसी कारण से मेरे पास यह समस्या केवल स्थानीय रूप से थी, रिमोट सर्वर पर नहीं। क्या किया:

-> नेटबीन्स द्वारा प्रदान किए गए डिफ़ॉल्ट पोम संस्करण के बजाय जावा-वेब-एपीआई 7.0 का उपयोग कर रहा है, जो जावा-वेब-एपीआई 6.0 है, इसलिए:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    <type>jar</type>
</dependency>

-> इस javaee-web-api-7.0.jar को सर्वर पर एक lib के रूप में अपलोड करें (डोमेन 1 फ़ोल्डर में काम करने वाला फ़ोल्डर) और सर्वर को पुनरारंभ करें।


यह मैच "आपका रनटाइम क्लासपाथ सीडीआई एपीआई से संबंधित जार में स्वच्छ और डुप्लिकेट से मुक्त है।" दूसरे शब्दों में, आपका रनटाइम क्लासपाथ किसी तरह से डुप्लिकेट लाइब्रेरीज़ के साथ खिलवाड़ था।
BalusC

वास्तव में, और आपके जवाब से मुझे उस संभावित मुद्दे की पहचान करने में मदद मिली, जिस पर मुझे ध्यान केंद्रित करना चाहिए ;-) यहाँ सिर्फ मेरे विशिष्ट समाधान के विवरण को साबित करते हुए, यह कुछ उपयोगकर्ताओं के लिए समय बचा सकता है।
सीनीकेल

1

मैंने स्वयं को हल करने के बाद इस त्रुटि पर अपनी खोज साझा करने का निर्णय लिया।

सबसे पहले, BalusC के समाधानों को गंभीरता से लिया जाना चाहिए, लेकिन फिर Netbeans में एक और संभावना है कि विशेष रूप से एंटरप्राइज़ एप्लिकेशन प्रोजेक्ट (EAR) बनाते समय जागरूक होना चाहिए मावेन का उपयोग करके का ।

Netbeans एक मूल POM फ़ाइल , एक EAR प्रोजेक्ट , एक EJB प्रोजेक्ट और एक WAR प्रोजेक्ट बनाता है । मेरी परियोजना में बाकी सब कुछ ठीक था, और मैंने लगभग यह मान लिया कि समस्या ग्लासफिश 4.0 में एक बग है (मुझे इसे नेटबीन्स में स्थापित और प्लग करना होगा) क्योंकि ग्लासफिश 4.1 में एक वेल्ड सीडीआई बग है जो नेटबिन्स 8.0 में एम्बेडेड ग्लासफिश 4.1 बनाता है। एक पैच के अलावा 2 अनुपयोगी।

उपाय:

हल करने के लिए "लक्ष्य नहीं पहुंचा जा सकता, पहचानकर्ता 'सेम' अशक्त का संकल्प" त्रुटि-

मैं मूल POM प्रोजेक्ट राइट-क्लिक करें, और गुण चुनें । एक प्रोजेक्ट गुण डायलॉग प्रकट होता है, "स्रोत" पर क्लिक करें, आप " स्रोत / बाइनरी फॉर्मेट " को 1.5 और " एन्कोडिंग " सेट को विंडोज 1250 पर देखने के लिए आश्चर्यचकित होंगे । " सोर्स / बाइनरी फॉर्मेट " को 1.6 0r 1.7 में बदल दें, जो भी आप अपने प्रोजेक्ट को CDI के अनुरूप बनाना पसंद करते हैं, और UTF-8 को " एन्कोडिंग " करते हैं।

अन्य सभी उपप्रोजेक्ट्स (EAR, EJB, WAR) के लिए भी यही करें यदि वे पहले से ही कम्पार्टेबल नहीं हैं। अपना प्रोजेक्ट चलाएं, और आपको वह त्रुटि दोबारा नहीं मिलेगी।

मुझे उम्मीद है कि यह किसी को भी इसी तरह की त्रुटि होने में मदद करता है।


मुझे आपका उत्तर सामान्य रूप से समझने के लिए कठिन लगता है (सीधे संबंधित जानकारी के लिए बहुत कुछ नहीं) और यह भी कि स्रोत / द्विआधारी प्रारूप और एन्कोडिंग इस मुद्दे में एक भूमिका निभाते हैं। क्या आप यह सुनिश्चित कर रहे हैं कि यह सिर्फ एक अच्छा / पूर्ण पुनर्निर्माण को ट्रिगर न करे जो समस्या को हल करे?
कुकटेलजे

1

मैंने अपना समाधान साझा करने का निर्णय लिया, क्योंकि यद्यपि यहाँ दिए गए कई उत्तर मददगार थे, फिर भी मुझे यह समस्या थी। मेरे मामले में, मैं अपने नए प्रोजेक्ट के लिए JSF 2.3, jdk10, jee8, cdi 2.0 का उपयोग कर रहा हूं और मैंने वाइल्डफ्लाइ 12 पर अपना ऐप चलाया है, जो पैरामीटर स्टैंडअलोन.श -Dee8.preview.mode के साथ सर्वर शुरू कर रहा है - जैसा कि वाइल्डफ्लाइ वेबसाइट पर अनुशंसित है। । "सेम टू नाल को हल" के साथ समस्या वाइल्डफ्लाइ डाउनलोड करने के बाद गायब हो गई। 13. वाइल्डफ्लाइ 13 के लिए बिल्कुल उसी युद्ध को अपलोड करने से यह सब काम कर गया।


1

मैं इस त्रुटि पर अड़ गया क्योंकि जिस वर्ग में यह है @SpringBootApplication मैं नियंत्रक पैकेज का नाम बताना भूल गया हूं।

मैं इस बार और अधिक विशिष्ट होना चाहता था जो यह बताता था कि बेस पैकेज को कॉन्फ़िगर करने के बजाय स्प्रिंग को किन घटकों को स्कैन करना था।

यह इस तरह था:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service"})

लेकिन सही रूप इनमें से एक है:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service", "br.com.company.project.controller"})

@ComponentScan(basePackages = {"br.com.company.project")

मैंने अपना समाधान साझा करने का निर्णय लिया, क्योंकि यद्यपि सही उत्तर बहुत व्यापक है, लेकिन यह इस (मूर्खतापूर्ण) गलती को कवर नहीं करता है :)


0

मेरे मामले में, मैंने @Named ("beanName") में एक वर्तनी की गलती की सराहना की, इसे "beanName" माना गया, लेकिन मैंने "beanNam" लिखा, उदाहरण के लिए।


0

मैं javaee कंटेनर के लिए वाइल्डफ्लाइ 10 का उपयोग कर रहा हूं। मैंने "टारगेट अनरेचेबल, 'एंटिटी' लौटी अशक्त" समस्या का अनुभव किया था। BalusC द्वारा सुझावों के लिए धन्यवाद, लेकिन समाधान से बाहर मेरा मुद्दा समझाया। गलती से "आयात com.sun.istack.log.Logger?" का उपयोग करना इसके बजाय "import org.jboss.logging.Logger?" कारण CDI ने JSF EL लागू किया। आशा है कि यह समाधान में सुधार करने में मदद करता है।


0

मुझे भी यही समस्या थी। समाधान बहुत सरल हो गया। ऐसा प्रतीत होता है कि एक डाएटेबल गेट्टर के रूप में विधि चाहता है, अर्थात गेटसमेथोड (), न कि केवल कुछ मैथोड ()। मेरे मामले में डेटाटेबल में मैं findResults बुला रहा था। मैंने अपने बैकिंग बीन में getFindResults () में विधि बदल दी और यह काम कर गया।

एक कमांडबटन ने उस काम के बिना काम किया, जिसने इसे केवल और अधिक भ्रमित करने के लिए काम किया।


0

# 2 के रूप में, मेरे मामले में यह जादुई रूप से प्रतिस्थापित होने के बाद जीवन में आया

<body>

साथ टैग करें

<h:body>

कई (सरल, ईमानदार होने के लिए) जेएसएफ परियोजनाओं को करने के बाद, मुझे अब इसे स्थापित करने के लिए कुछ भी अलग करने की याद नहीं है, और मुझे पहली बार इस तरह की त्रुटि मिली। मैं एक बहुत ही मूल लॉगिन पेज (उपयोगकर्ता नाम, पासवर्ड, उपयोगकर्ता बीन ...) बना रहा था और हमेशा की तरह सब कुछ सेट कर दिया। एकमात्र अंतर जो मैंने देखा है, वह पूर्वोक्त है। शायद किसी को यह उपयोगी लगता है।


0

मेरे मामले में मुद्दा यह था कि मैं एक निर्माणकर्ता को शामिल कर रहा था, लेकिन इंजेक्ट एनोटेशन के साथ एक खाली निर्माणकर्ता नहीं था, जैसे कि।

@Inject public VisitorBean() {}

मैंने बिना किसी कंस्ट्रक्टर के बस इसका परीक्षण किया और यह भी काम करता है।


0

1. विषय के लिए ( लक्ष्य पहुंच से बाहर, पहचानकर्ता 'बीन' को हल करने के लिए );

मैंने @BalusC और अन्य हिस्सेदारों के मूल्यवान उत्तरों की जाँच की लेकिन मैं इस समस्या को अपने परिदृश्य पर इस तरह से अधिक करता हूँ। अलग नाम के साथ एक नया एक्सएचटीएमएल बनाने और अलग-अलग नाम के साथ बीन क्लास बनाने के बाद फिर मैंने नए बीन क्लास और नई एक्सएचटीएमएल फाइल के लिए कदम से कदम कोड (कॉपी-पेस्ट नहीं) लिखा।


0

जब मैं AnnotationConfigWebApplicationContext संदर्भ param को web.xml फ़ाइल से हटाता हूं तो यह काम है

यदि आपको परम जैसा मिला है जो नीचे दिखाया गया है तो आपको इसे web.xml फ़ाइल से निकालना होगा

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 

विस्तृत करने के लिए परवाह है कि यह इसे हल क्यों करता है? या बल्कि क्यों यह समस्याओं का कारण बनता है?
कुकटेलजे

-1

JSF के साथ पुरानी शैली में कार्य करना आपको सेम-config.xml फ़ाइल (WEB-INF फ़ोल्डर में स्थित) में प्रबंधित बीन को परिभाषित करना होगा और इसे web.xml फ़ाइल में इस तरह बनाना होगा:

सेम-config.xml

<managed-bean>
  <managed-bean-name>"the name by wich your backing bean will be referenced"</managed-bean-name>
  <managed-bean-class>"your backing bean fully qualified class name"</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>    
</managed-bean>

(मैं अन्य scopes का उपयोग करने की कोशिश की है, लेकिन ...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>

-2

एक और सुराग: मैं JSF का उपयोग कर रहा था, और mvan निर्भरता को जोड़ा: com.sun.faces jsf-api A1 A1

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.11</version>
    </dependency>

फिर, मैंने प्राइमफेस में बदलने की कोशिश की, और प्राइमफेस निर्भरता को जोड़ा:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
</dependency>

मैंने अपने xhtml को h: p :, से xmlns: p = "http://primefaces.org// टेम्पलेट में जोड़ दिया। केवल JSF के साथ ही प्रॉजेक्ट ठीक चल रहा था, और मैनेज करना ठीक हो गया था। मुझे अगम्य वस्तु (javax.el.propertynotfoundexception) मिल रही थी। समस्या यह थी कि JSF ManagedBean को जेनरेट कर रहा था, न कि प्राइमफेस, और मैं ऑब्जेक्ट के लिए प्राइमफेस पूछ रहा था। मुझे अपने .pom, क्लीन और क्लीन से jsf-impl को हटाना था। प्रॉस्टिट स्थापित करें। सभी इस बिंदु से ठीक हो गए। आशा है कि मदद करता है।


2
समस्या के कारण के बारे में आपकी धारणा समझ में नहीं आती है। प्राइमफेस एक जेएसएफ कार्यान्वयन बिल्कुल नहीं है। यह आवश्यकता से मेल खाता है "आपका रनटाइम क्लासपाथ सीडीआई एपीआई से संबंधित जार में स्वच्छ और डुप्लिकेट से मुक्त है।" दूसरे शब्दों में, आपका रनटाइम क्लासपाथ किसी तरह से डुप्लिकेट लाइब्रेरी के साथ गड़बड़ कर रहा था और प्राइमफेस केवल इसे बढ़ा रहा था, जिससे यह पैदा नहीं हुआ।
बालुसक

-3

EL व्याख्या के रूप में $ {bean.propretyName} की व्याख्या करता है - संपत्ति का नाम getPropertyName () इस धारणा पर हो जाता है कि आप गेटर / सेटर बनाने के स्पष्ट या निहित तरीकों का उपयोग कर रहे हैं।

आप फ़ंक्शन के रूप में नाम की स्पष्ट रूप से पहचान करके इस व्यवहार को ओवरराइड कर सकते हैं: $ {bean.methodName ()} यह फ़ंक्शन विधि नाम () को सीधे संशोधन के बिना कहता है।

यह हमेशा सही नहीं होता है कि आपके एक्सेसर्स का नाम "गेट ..." हो।


1
यह सही अभ्यास नहीं है और इससे इनपुट घटकों के पीछे सही बसने वालों को आमंत्रित करना असंभव हो जाता है। यह भी उक्त अपवाद का कारण नहीं हो सकता। यह केवल उक्त अपवाद का कारण बनेगा, जिसके बजाय आपने एक एक्शन विधि अभिव्यक्ति में संपत्ति का संदर्भ देने की गलती action="#{bean.property}"की action="#{bean.method}"
BalusC

उल्लेखनीय रूप से, कार्यात्मक प्रोग्रामिंग के साथ आधुनिक जावा की दुनिया में, यह "सही अभ्यास" बदल रहा है। Dev.to/scottshipp/… और संदर्भ देखें । ध्यान दें कि लोम्बोक में "धाराप्रवाह" के लिए एक सेटिंग है जहां गेट / सेट नहीं जोड़े जाते हैं। हमारी कंपनी में 1000 इंजीनियर हैं जो वर्तमान अभ्यास के बारे में एक अलग दृष्टिकोण रखते हैं।
sdw

1
मुझे लगता है कि आप और आपके 1000 इंजीनियर गुणों को भ्रमित कर रहे हैं।
बालुसक

यह डिज़ाइन प्रथा बड़े पैमाने पर अनुप्रयोगों में बहुत उच्च संगति के साथ आम हो रही है। मुझे लगता है कि आपके डाउनवोट डिजाइन दिशानिर्देशों के एक दृष्टिकोण पर आधारित है, बजाय हमारे विशाल समुदाय को एक संभावित बग को ट्रैक करने में जवाब देने के मूल्य के बजाय।
sdw

1
है ना? क्षमा करें, मैं इस धारणा को अनदेखा नहीं कर सकता कि आपके पास कोई विचार नहीं है कि आप किस बारे में बात कर रहे हैं।
बालूसी

-3

मेरे मामले में "एल-री-1.0.जर" गायब था।


1
आम तौर पर आपको इसकी आवश्यकता नहीं होती है, इसलिए मामले में कुछ और है। सबसे शायद एक गंदा क्रम वर्गपथ। आपको उन लाइब्रेरियों को ठीक करना चाहिए, जो लंबे समय तक पुस्तकालयों को जोड़कर अभी तक बदतर बना सकती हैं, जो पहले से ही सर्वर द्वारा प्रदान किए जाने वाले हैं।
बालुसक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.