การระบุและการแก้ปัญหา javax.el.PropertyNotFoundException: Target Unreachable


128

เมื่อพยายามอ้างอิง bean ที่ได้รับการจัดการใน EL เช่นนั้น#{bean.entity.property}บางครั้งjavax.el.PropertyNotFoundException: Target Unreachableจะมีการโยนข้อยกเว้นโดยปกติเมื่อต้องการตั้งค่าคุณสมบัติ bean หรือเมื่อมีการเรียกใช้การดำเนินการ bean

ดูเหมือนจะมีข้อความห้าประเภทที่แตกต่างกัน:

  1. เป้าหมายไม่สามารถเข้าถึงได้ตัวระบุ 'bean' ถูกแก้ไขเป็น null
  2. เป้าหมายไม่สามารถเข้าถึงได้ 'เอนทิตี' ส่งคืนค่าว่าง
  3. เป้าหมายไม่สามารถเข้าถึงได้ 'null' ส่งคืนค่าว่าง
  4. เป้าหมายไม่สามารถเข้าถึงได้ '' 0 '' ส่งคืนค่าว่าง
  5. เป้าหมายไม่สามารถเข้าถึงได้ 'BracketSuffix' ส่งคืนค่า null

พวกเขาทั้งหมดหมายถึงอะไร? มีสาเหตุมาจากอะไรและควรแก้ไขอย่างไร?


สำหรับผู้ที่ใช้ weblogic ลองใช้ลิงค์นี้ /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#comment77843630_45422943
DenisMP

ทันใดนั้นสิ่งนี้ก็ทำให้ฉันเสียหาย ... ฉันแก้ไขสิ่งนี้ (มันไม่รู้จัก bean ของฉัน) โดยหยุดเซิร์ฟเวอร์ลบ javax.faces.jar (Mojarra) ลบไดเร็กทอรีบิลด์ของฉันและล้างเซิร์ฟเวอร์ WebLogic ของฉัน \ tmp \ และ \ cache \ โฟลเดอร์ในโดเมนเริ่มต้นเซิร์ฟเวอร์อีกครั้งพยายามเผยแพร่และล้มเหลวเนื่องจากไม่พบ javax, SVN-reverting การลบ javax.faces.jar (ดังนั้นคุณสามารถย้ายออกแล้ว ย้ายกลับเข้าไป) และเผยแพร่ ทันใดนั้นมันก็กลับมาทำงานอีกครั้ง ...
Andrew

ตรวจสอบสองสามบรรทัดด้านบนเสมอสำหรับข้อความบันทึกที่เกี่ยวข้องที่เกิดขึ้นในการปรับใช้นี่คือสาเหตุที่แท้จริง: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]และFinancialAdminReceiptWebRequestBeanไม่พบbean ( ) และแก้ไขได้อย่างnullแน่นอน ข้อผิดพลาดทั่วไปอีกประการหนึ่งคือห้ามรีสตาร์ทแอ็พพลิเคชันเซิร์ฟเวอร์หลังจากเปลี่ยนชื่อหรือย้ายคลาส / อินเทอร์เฟซ (หรือลืมclean)
Roland

คำตอบ:


239

1. เป้าหมายไม่สามารถเข้าถึงได้ตัวระบุ 'bean' ถูกแก้ไขเป็น null

นี้เดือดลงไปว่าเช่นถั่วที่มีการจัดการตัวเองไม่สามารถพบได้โดยระบุว่าที่ (การจัดการชื่อถั่ว) #{bean}ในเอเช่นดังนั้น

การระบุสาเหตุสามารถแบ่งออกเป็นสามขั้นตอน:

ก. ใครเป็นคนจัดการถั่ว?
ข. ชื่อถั่วที่มีการจัดการ (ค่าเริ่มต้น) คืออะไร?
ค. ชั้นเรียนถั่วสำรองอยู่ที่ไหน

1a. ใครเป็นคนจัดการถั่ว?

ขั้นตอนแรกคือการตรวจสอบกรอบการจัดการ bean ใดที่รับผิดชอบในการจัดการอินสแตนซ์ bean เป็นJSFผ่าน@ManagedBeanหรือไม่ หรือเป็นCDIผ่าน@Named? หรือว่าSpringผ่าน@Component? คุณแน่ใจได้หรือไม่ว่าคุณไม่ได้ผสมคำอธิบายประกอบเฉพาะของกรอบการจัดการถั่วหลายรายการในคลาสถั่วสำรองเดียวกัน เช่น@Named @Componentหรือ@Named @ManagedBeanหรือ@ManagedBean @Component. นี่เป็นสิ่งที่ไม่ถูกต้อง bean ต้องได้รับการจัดการโดยเฟรมเวิร์กการจัดการ bean มากที่สุดหนึ่งเฟรมเวิร์กและเฟรมเวิร์กนั้นต้องได้รับการกำหนดค่าอย่างเหมาะสม หากคุณไม่มีความคิดที่จะเลือกให้ไปที่Backing beans (@ManagedBean) หรือ CDI Beans (@Named)? และการรวม Spring JSF: วิธีการฉีด Spring component / service ใน JSF Managed bean

ในกรณีที่เป็นJSFที่จัดการ bean ผ่าน@ManagedBeanคุณต้องตรวจสอบสิ่งต่อไปนี้:

  • การfaces-config.xmlประกาศรากเข้ากันได้กับ JSF 2.0 ดังนั้นไฟล์ XSD และอย่างน้อยversionต้องระบุ JSF 2.0 ขึ้นไปจึงไม่ใช่ 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ระวังการเติมข้อความอัตโนมัติ IDE เป็นที่ทราบกันดีว่า Eclipse จะแนะนำข้อผิดพลาดโดยอัตโนมัติเป็นรายการแรกในรายการ

  • คุณไม่ได้แทนที่@ManagedBeanด้วย<managed-bean>รายการสไตล์ JSF 1.x ในfaces-config.xmlคลาส bean สำรองเดียวกันพร้อมกับชื่อ bean ที่มีการจัดการอื่น @ManagedBeanหนึ่งในนี้จะมีความสำคัญมากกว่า การลงทะเบียน bean ที่มีการจัดการfaces-config.xmlไม่จำเป็นเนื่องจาก JSF 2.0 เพียงแค่ลบออก
  • คลาสพา ธ รันไทม์ของคุณสะอาดและไม่มีรายการซ้ำใน JAR ที่เกี่ยวข้องกับ JSF API ตรวจสอบให้แน่ใจว่าคุณไม่ได้ผสมการใช้งาน JSF หลายอย่าง (Mojarra และ MyFaces) ตรวจสอบให้แน่ใจว่าคุณไม่ได้ให้ไฟล์ JSF อื่นหรือแม้แต่ไฟล์ Java EE API JAR พร้อมกับเว็บแอปเมื่อคอนเทนเนอร์เป้าหมายรวม JSF API ไว้แล้ว โปรดดูส่วน"การติดตั้ง JSF" ในหน้า JSF wikiสำหรับคำแนะนำในการติดตั้ง JSF ในกรณีที่คุณต้องการอัปเกรด JSF ที่รวมคอนเทนเนอร์จาก WAR บนแทนที่จะเป็นในคอนเทนเนอร์เองตรวจสอบให้แน่ใจว่าคุณได้สั่งให้คอนเทนเนอร์เป้าหมายใช้ JSF API / im ที่รวม WAR
  • หากคุณกำลังบรรจุภัณฑ์ JSF การจัดการถั่วในขวดแล้วให้แน่ใจว่า JAR มีอย่างน้อย JSF /META-INF/faces-config.xml2.0 ดูวิธีอ้างอิงถั่วที่มีการจัดการ JSF ซึ่งมีให้ในไฟล์ JAR ได้อย่างไร
  • หากคุณกำลังจริงโดยใช้ 1.x JSF จูราสสิและคุณไม่สามารถอัปเกรดแล้วคุณจำเป็นต้องลงทะเบียนผ่านทางถั่ว<managed-bean>ในแทนfaces-config.xml @ManagedBeanอย่าลืมแก้ไขเส้นทางการสร้างโครงการของคุณที่คุณไม่มีไลบรารี JSF 2.x อีกต่อไป (เพื่อไม่ให้@ManagedBeanคำอธิบายประกอบคอมไพล์สำเร็จอย่างสับสน)


ในกรณีที่เป็นCDIที่จัดการถั่ว@Namedคุณต้องตรวจสอบสิ่งต่อไปนี้:

  • CDI 1.0 (Java EE 6) ต้องการ/WEB-INF/beans.xmlไฟล์เพื่อเปิดใช้งาน CDI ใน WAR อาจว่างเปล่าหรืออาจมีเพียงเนื้อหาต่อไปนี้:

    <?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 ข้างต้นbeans.xmlจะทำงานเหมือนกับ CDI 1.0 เมื่อมีการ CDI 1.1 เข้ากันได้beans.xmlกับอย่างชัดเจนversion="1.1"แล้วมันจะเป็นค่าเริ่มต้นเพียงลงทะเบียน@Namedถั่วกับ CDI อย่างชัดเจนขอบเขตคำอธิบายประกอบเช่น@RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScopedฯลฯ ในกรณีที่คุณตั้งใจจะลงทะเบียนถั่วทั้งหมดเป็น CDI การจัดการถั่วแม้ที่ไม่มีความชัดเจน ขอบเขต CDI ใช้ CDI 1.1 ด้านล่างที่เข้ากันได้/WEB-INF/beans.xmlกับ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.RequestScoped CDI javax.enterprise.context.RequestScopedระวังการเติมข้อความอัตโนมัติ IDE

  • เมื่อใช้กระโดง 2.3.0-2.3.2 และ CDI 1.1 ขึ้นไปด้วยbean-discovery-mode="annotated"(เริ่มต้น) แล้วคุณจะต้องอัพเกรดกระโดงจะ 2.3.3 หรือใหม่กว่าเนื่องจากมีข้อผิดพลาด ในกรณีที่คุณไม่สามารถอัปเกรดแล้วคุณจะต้องทั้งชุดbean-discovery-mode="all"ในbeans.xmlหรือจะนำเฉพาะ JSF 2.3 @FacesConfigคำอธิบายประกอบในชั้นเรียนโดยพลการในสงคราม (โดยทั่วไปการจัดเรียงของแอพลิเคชันบางขอบเขตระดับเริ่มต้น)
  • คอนเทนเนอร์ EE ที่ไม่ใช่ Java เช่น Tomcat และ Jetty ไม่ได้มาพร้อมกับ CDI ที่แถมมา คุณต้องติดตั้งด้วยตนเอง มันทำงานได้ดีกว่าการเพิ่ม JAR ของไลบรารี สำหรับ Tomcat โปรดทำตามคำแนะนำในคำตอบนี้: จะติดตั้งและใช้ CDI บน Tomcat ได้อย่างไร?
  • คลาสพา ธ รันไทม์ของคุณสะอาดและไม่มีรายการซ้ำใน JAR ที่เกี่ยวข้องกับ CDI API ตรวจสอบให้แน่ใจว่าคุณไม่ได้ผสมการใช้งาน CDI หลายอย่าง (Weld, OpenWebBeans ฯลฯ ) ตรวจสอบให้แน่ใจว่าคุณไม่ได้ให้ไฟล์ CDI อื่นหรือแม้แต่ไฟล์ Java EE API JAR บนเว็บแอปเมื่อคอนเทนเนอร์เป้าหมายรวม CDI API ไว้แล้ว
  • หากคุณบรรจุถั่วที่จัดการ CDI สำหรับมุมมอง JSF ใน JAR ให้ตรวจสอบว่า 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>
  • (ด้านบนคือทั้งหมดที่ฉันรู้เกี่ยวกับ Spring - ฉันไม่ได้ทำ Spring - อย่าลังเลที่จะแก้ไข / แสดงความคิดเห็นเกี่ยวกับสาเหตุอื่น ๆ ที่เกี่ยวข้องกับ Spring เช่นปัญหาที่เกี่ยวข้องกับการกำหนดค่า XML)


ในกรณีที่มันเป็นองค์ประกอบทวนใครเป็นผู้จัดการ (ที่ซ้อนกัน) ถั่วผ่านทางvarแอตทริบิวต์ (เช่น<h:dataTable var="item">, <ui:repeat var="item">, <p:tabView var="item">ฯลฯ ) และคุณได้จริง "เป้าหมายไม่สามารถเข้าถึงตัวระบุ 'รายการ' มีมติ null" แล้วคุณต้องให้แน่ใจว่าต่อไปนี้ :

  • #{item}ไม่ได้อ้างถึงในbindingattribtue องค์ประกอบของเด็ก ๆ สิ่งนี้ไม่ถูกต้องเนื่องจากbindingแอตทริบิวต์ทำงานในช่วงเวลาสร้างมุมมองไม่ใช่ในช่วงเวลาแสดงผลมุมมอง ยิ่งไปกว่านั้นมีส่วนประกอบทางกายภาพเพียงอย่างเดียวในโครงสร้างส่วนประกอบซึ่งนำมาใช้ซ้ำในทุกรอบการทำซ้ำ กล่าวอีกนัยหนึ่งคุณควรใช้binding="#{bean.component}"แทนbinding="#{item.component}". แต่ที่ดีกว่ามากคือการกำจัดส่วนประกอบที่กัดเข้ากับถั่วทั้งหมดและตรวจสอบ / ถามวิธีการที่เหมาะสมสำหรับปัญหาที่คุณคิดจะแก้ด้วยวิธีนี้ ดูเพิ่มเติมว่าแอตทริบิวต์ "การผูก" ทำงานอย่างไรใน JSF ควรใช้เมื่อใดและอย่างไร?


1b. ชื่อถั่วที่มีการจัดการ (ค่าเริ่มต้น) คืออะไร?

ขั้นตอนที่สองคือการตรวจสอบชื่อ bean ที่มีการจัดการที่ลงทะเบียนแล้ว ข้อตกลงการใช้ JSF และ Spring เป็นไปตามข้อกำหนดJavaBeansในขณะที่ CDI มีข้อยกเว้นขึ้นอยู่กับ CDI im / version

  • FooBeanระดับการสนับสนุนถั่วเช่นด้านล่าง

    @Named
    public class FooBean {}

    จะในเฟรมเวิร์กการจัดการ bean ทั้งหมดมีชื่อ bean ที่มีการจัดการดีฟอลต์#{fooBean}ตามข้อกำหนด JavaBeans

  • FOOBeanระดับการสนับสนุนถั่วเช่นด้านล่าง

    @Named
    public class FOOBean {}

    ซึ่งชื่อคลาสที่ไม่มีเงื่อนไขเริ่มต้นด้วยตัวพิมพ์ใหญ่อย่างน้อยสองตัวจะอยู่ใน JSF และ Spring มีชื่อ bean ที่มีการจัดการดีฟอลต์ซึ่งเป็นชื่อคลาสที่ไม่มีคุณสมบัติ#{FOOBean}ตรงตามข้อกำหนดของ JavaBeans ใน CDI นี่เป็นกรณีของ Weld เวอร์ชันที่เผยแพร่ก่อนเดือนมิถุนายน 2015 แต่ไม่ใช่ในเวอร์ชัน Weld ที่วางจำหน่ายหลังเดือนมิถุนายน 2015 (2.2.14 / 2.3.0.B1 / 3.0.0.A9) หรือใน OpenWebBeans เนื่องจากการกำกับดูแลใน ข้อมูลจำเพาะ ในเวอร์ชัน Weld เหล่านั้นและในเวอร์ชัน OWB ทั้งหมดจะมีเฉพาะอักขระตัวแรกที่ลด#{fOOBean}ลงเท่านั้น

  • หากคุณระบุชื่อถั่วที่มีการจัดการไว้อย่างชัดเจนfooดังต่อไปนี้

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

    หรือเท่ากันด้วย@ManagedBean(name="foo")หรือ@Component("foo")แล้วมันจะเพียง แต่จะสามารถใช้ได้โดยการ#{foo}จึงไม่ได้#{fooBean}โดย


1 ค. ชั้นเรียนถั่วสำรองอยู่ที่ไหน

ขั้นตอนที่สามจะเป็นการตรวจสอบซ้ำหากคลาสของการสำรองข้อมูลอยู่ในตำแหน่งที่ถูกต้องในไฟล์ WAR ที่สร้างและปรับใช้ ตรวจสอบให้แน่ใจว่าคุณได้ทำการล้างสร้างใหม่ปรับใช้และรีสตาร์ทโปรเจ็กต์และเซิร์ฟเวอร์อย่างถูกต้องในกรณีที่คุณยุ่งอยู่กับการเขียนโค้ดและกด F5 อย่างไม่เต็มใจในเบราว์เซอร์ หากยังไร้ผลให้ระบบบิลด์สร้างไฟล์ WAR จากนั้นคุณจะแตกและตรวจสอบด้วยเครื่องมือ ZIP .classไฟล์ที่คอมไพล์ของคลาส bean สำรองต้องอยู่ในโครงสร้างแพ็กเกจใน/WEB-INF/classes. หรือเมื่อบรรจุเป็นส่วนหนึ่งของโมดูล JAR JAR ที่มี.classไฟล์ที่คอมไพล์แล้วจะต้องอยู่ใน/WEB-INF/libนั้นดังนั้นจึงไม่ใช่เช่น EAR /libหรือที่อื่น ๆ

หากคุณกำลังใช้ Eclipse ตรวจสอบให้แน่ใจว่าคลาสของ backing bean อยู่ในsrcดังนั้นจึงไม่ใช่ WebContentและตรวจสอบให้แน่ใจว่าเปิดใช้งานProject> Build Automaticallyแล้ว หากคุณกำลังใช้ Maven ตรวจสอบให้แน่ใจว่าระดับการสนับสนุนถั่วอยู่ในsrc/main/javaจึงไม่ได้อยู่ในหรือsrc/main/resourcessrc/main/webapp

หากคุณบรรจุเว็บแอปพลิเคชันเป็นส่วนหนึ่งของ EAR ที่มี EJB + WAR คุณต้องตรวจสอบให้แน่ใจว่าคลาสแบ็คกิ้งบีนอยู่ในโมดูล WAR ดังนั้นจึงไม่อยู่ในโมดูล EAR หรือโมดูล EJB ระดับธุรกิจ (EJB) ต้องปราศจากสิ่งประดิษฐ์ที่เกี่ยวข้องกับระดับเว็บ (WAR) ใด ๆ เพื่อให้ระดับธุรกิจสามารถนำกลับมาใช้ใหม่ได้ในหลาย ๆ เว็บ (JSF, JAX-RS, JSP / Servlet ฯลฯ )


2. เป้าหมายไม่สามารถเข้าถึงได้ 'เอนทิตี' ส่งคืนค่าว่าง

นี้เดือดลงไปว่าที่ซ้อนกันสถานที่ให้บริการentityในขณะที่กลับมา#{bean.entity.property} nullนี้มักจะมีเพียง exposes เมื่อ JSF ความต้องการที่จะตั้งค่าสำหรับการpropertyผ่านองค์ประกอบการป้อนข้อมูลเช่นนี้ในขณะที่กลับมาจริง#{bean.entity}null

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

คุณต้องตรวจสอบให้แน่ใจว่าคุณได้เตรียมเอนทิตีแบบจำลองไว้ล่วงหน้าใน a @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; การทำสิ่งนี้ในตัวสร้างปกติจะล้มเหลวในกรณีที่คุณใช้กรอบการจัดการ bean ซึ่งใช้พร็อกซีเช่น CDI ใช้@PostConstructเพื่อเชื่อมต่อการเริ่มต้นอินสแตนซ์ bean ที่มีการจัดการเสมอ(และใช้@PreDestroyเพื่อเชื่อมต่อกับการทำลายอินสแตนซ์ bean ที่มีการจัดการ) นอกจากนี้ในตัวสร้างคุณจะไม่สามารถเข้าถึงการอ้างอิงฉีดใด ๆ , See also NullPointerException ขณะที่พยายามจะเข้าถึง @Inject ถั่วในตัวสร้าง

ในกรณีที่entityIdจะถูกส่งผ่านทาง<f:viewParam>ที่คุณจะต้องใช้แทน<f:viewAction> @PostConstructดูเพิ่มเติมเมื่อใช้ f: viewAction / preRenderView เทียบกับ PostConstruct?

คุณต้องตรวจสอบให้แน่ใจว่าคุณได้เก็บรักษาnullโมเดลที่ไม่ใช่โมเดลไว้ในระหว่างการโพสต์แบ็คในกรณีที่คุณสร้างมันขึ้นมาด้วยadd()วิธีการดำเนินการเท่านั้น ง่ายที่สุดคือใส่ถั่วในขอบเขตมุมมอง ดูวิธีการเลือกขอบเขตถั่วที่เหมาะสม


3. เป้าหมายไม่สามารถเข้าถึงได้ 'null' ส่งคืนค่าว่าง

สิ่งนี้มีสาเหตุเช่นเดียวกับ # 2 มีเพียงการใช้งาน EL (รุ่นเก่า) เท่านั้นที่ใช้งานได้ค่อนข้างติดขัดในการรักษาชื่อคุณสมบัติเพื่อแสดงในข้อความข้อยกเว้นซึ่งท้ายที่สุดจะแสดงเป็น 'null' อย่างไม่ถูกต้อง #{bean.entity.subentity.subsubentity.property}นี้จะทำให้การแก้จุดบกพร่องและแก้ไขบิตยากเมื่อคุณได้ค่อนข้างบางคุณสมบัติที่ซ้อนกันชอบดังนั้น

วิธีแก้ปัญหายังคงเหมือนเดิม: ตรวจสอบให้แน่ใจว่าเอนทิตีที่ซ้อนกันเป็นปัญหาไม่ได้nullอยู่ในทุกระดับ


4. เป้าหมายไม่สามารถเข้าถึงได้ '' 0 '' ส่งคืนค่าว่าง

สิ่งนี้มีสาเหตุเช่นเดียวกับ # 2 เพียงการใช้งาน EL (รุ่นเก่า) ที่ใช้เท่านั้นที่มีข้อบกพร่องในการกำหนดข้อความข้อยกเว้น สิ่งนี้จะแสดงเฉพาะเมื่อคุณใช้เครื่องหมายวงเล็บปีกกา[]ใน EL ใน#{bean.collection[index]}กรณีที่#{bean.collection}ตัวมันเองไม่เป็นโมฆะ แต่ไม่มีรายการในดัชนีที่ระบุ จากนั้นข้อความดังกล่าวจะต้องตีความว่า:

Target Unreachable, "collection [0]" ส่งคืนค่าว่าง

วิธีแก้ปัญหาก็เหมือนกับ # 2: ตรวจสอบให้แน่ใจว่ามีรายการคอลเลกชัน


5. Target Unreachable, 'BracketSuffix' ส่งคืนค่า null

นี้มีจริงสาเหตุเดียวกับ # 4 เท่านั้น (เก่า) การดำเนิน EL ถูกนำมาใช้ค่อนข้างรถในการรักษาดัชนีย้ำที่จะแสดงในข้อความแสดงข้อยกเว้นซึ่งในที่สุดสัมผัสไม่ถูกต้องเป็น 'BracketSuffix' ]ซึ่งจริงๆตัวละคร สิ่งนี้ทำให้การดีบักและแก้ไขยากขึ้นเล็กน้อยเมื่อคุณมีหลายรายการในคอลเลกชัน


สาเหตุอื่น ๆ ที่เป็นไปได้ของjavax.el.PropertyNotFoundException:


ฉันวิ่งไปที่หมายเลข 3 #{bean.entity.property}ส่งออกค่า แต่<p:selectBooleanCheckbox value="#{bean.entity.property}"/>ล้มเหลว บูลีนของฉันมีตัวตั้งค่า คุณสมบัติจำนวนเต็มในเอนทิตีเดียวกันจะทำงานเมื่อใช้ในฟิลด์อินพุต ความคิดใด ๆ ?
Jasper de Vries

สิ่งที่ควรตรวจสอบอีกประการหนึ่งคือตรวจสอบให้แน่ใจว่าการใช้งาน JSF และ CDI ของคุณผสานรวมเข้าด้วยกันซึ่งเป็นปัญหาของฉัน: stackoverflow.com/questions/44064995/…
Jerry B. no.1 Intern

ตาม: Target Unreachable, identifier 'bean' resolved to nullในโครงการ maven หลายโมดูล (มีโมดูลสำหรับ ejb, web, ear) ตรวจสอบให้แน่ใจว่าเว็บโมดูลของคุณประกาศการพึ่งพาโมดูล ejb ของคุณ หากไม่@ManagedBeanสามารถแก้ไขได้โดยใช้ JSF2.0 และคุณต้องประกาศในรูปแบบfaces-config.xml. ใช้เวลาประมาณสองชั่วโมงโดยสังเกตว่าฉันไม่ได้ประกาศการพึ่งพาเพื่อรวม ejb ไว้ในโมดูลเว็บของฉัน (มี ejb และ web อยู่ในหูของฉันเท่านั้น)
บิช

1
@bish สิ่งประดิษฐ์ส่วนหน้าเช่น@ManagedBeanคลาสไม่ได้อยู่ในชั้นบริการ (โครงการ EJB) ตั้งแต่แรก ดูstackoverflow.com/questions/13011392/jsf-service-layer
BalusC

ถั่วที่ไม่สามารถต่อเนื่องทำให้เกิดข้อผิดพลาดนี้ได้หรือไม่ (เนื่องจากฉันสงสัยว่าเป็นกรณีในstackoverflow.com/questions/47533584/… (แต่ไม่สามารถลองด้วยตัวเองได้ในขณะนี้))
Kukeltje

6

สำหรับใครที่ยังติด ...

การใช้ NetBeans 8.1 และ GlassFish 4.1 กับ CDI ด้วยเหตุผลบางประการฉันมีปัญหานี้เฉพาะในเครื่องเท่านั้นไม่ใช่บนเซิร์ฟเวอร์ระยะไกล เคล็ดลับอะไร:

-> ใช้ javaee-web-api 7.0 แทนเวอร์ชัน pom เริ่มต้นที่ให้บริการโดย NetBeans ซึ่งเป็น javaee-web-api 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 ไปยังเซิร์ฟเวอร์ (โฟลเดอร์ lib ในโฟลเดอร์ domain1) และรีสตาร์ทเซิร์ฟเวอร์


สิ่งนี้ตรงกับ"คลาสพา ธ รันไทม์ของคุณสะอาดและไม่มีรายการซ้ำใน JAR ที่เกี่ยวข้องกับ CDI API" กล่าวอีกนัยหนึ่งคลาสพา ธ รันไทม์ของคุณยุ่งเหยิงกับไลบรารีที่ซ้ำกัน
BalusC

อันที่จริงคำตอบของคุณช่วยให้ฉันระบุปัญหาที่น่าจะเป็นไปได้ที่ฉันควรมุ่งเน้น ;-) เพียงแค่แจ้งรายละเอียดของโซลูชันเฉพาะของฉันที่นี่อาจช่วยประหยัดเวลาให้กับผู้ใช้สองสามราย
seinecle

1

ฉันตัดสินใจที่จะแบ่งปันสิ่งที่พบเกี่ยวกับข้อผิดพลาดนี้หลังจากแก้ไขปัญหาด้วยตัวเองแล้ว

ประการแรกโซลูชัน BalusC ควรได้รับการพิจารณาอย่างจริงจัง แต่ก็มีอีกปัญหาหนึ่งใน Netbeans ที่ต้องระวังโดยเฉพาะอย่างยิ่งเมื่อสร้างEnterprise Application Project (EAR)โดยใช้ Maven

Netbeans สร้างเป็นไฟล์หลัก POMเป็นโครงการ EARเป็นโครงการ EJBและโครงการ WAR ทุกอย่างในโปรเจ็กต์ของฉันใช้ได้ดีและฉันเกือบจะคิดว่าปัญหาเป็นข้อบกพร่องใน GlassFish 4.0 (ฉันต้องติดตั้งและเสียบเข้ากับ Netbeans) เนื่องจาก GlassFish 4.1 มีข้อผิดพลาด Weld CDI ซึ่งทำให้ GlassFish 4.1 ใน Netbeans 8.0 2 ใช้ไม่ได้ยกเว้นผ่านแพทช์

สารละลาย:

ในการแก้ไขข้อ ผิดพลาด"Target Unreachable ตัวระบุ" bean "ได้รับการแก้ไขเป็น null"

ผมคลิกขวาที่โครงการพ่อแม่ POM และเลือกProperties กล่องโต้ตอบคุณสมบัติโครงการปรากฏขึ้นคลิก "แหล่งที่มา" คุณจะประหลาดใจเมื่อเห็น " รูปแบบแหล่งที่มา / รูปแบบไบนารี " ตั้งค่าเป็น 1.5 และ "การเข้ารหัส " ตั้งค่าเป็น Windows 1250 เปลี่ยน " แหล่งที่มา / รูปแบบไบนารี " เป็น 1.6 0r 1.7 แล้วแต่อย่างใด คุณต้องการทำให้โครงการของคุณเป็นไปตามมาตรฐาน CDI และ "การเข้ารหัส " เป็น UTF-8

ทำเช่นเดียวกันสำหรับโครงการย่อยอื่น ๆ ทั้งหมด (EAR, EJB, WAR) หากยังไม่สามารถเปรียบเทียบกันได้ เรียกใช้โครงการของคุณและคุณจะไม่ได้รับข้อผิดพลาดนั้นอีก

ฉันหวังว่านี่จะช่วยให้ใครบางคนพบข้อผิดพลาดที่คล้ายกัน


ฉันพบว่าคำตอบของคุณยากที่จะเข้าใจโดยทั่วไป (ซึ่งเป็นข้อมูลที่ไม่เกี่ยวข้องโดยตรงมากนัก) และรูปแบบซอร์ส / ไบนารีและการเข้ารหัสมีบทบาทในปัญหานี้ คุณแน่ใจหรือไม่ว่าการเปลี่ยนแปลงนี้ไม่เพียง แต่ทำให้เกิดการสร้างใหม่ที่ดี / สมบูรณ์ซึ่งช่วยแก้ปัญหาได้
Kukeltje

1

ฉันตัดสินใจแบ่งปันวิธีแก้ปัญหาของฉันเพราะแม้ว่าคำตอบมากมายที่ให้มาจะเป็นประโยชน์ แต่ฉันก็ยังมีปัญหานี้ ในกรณีของฉันฉันใช้ JSF 2.3, jdk10, jee8, cdi 2.0 สำหรับโปรเจ็กต์ใหม่ของฉันและฉันได้รันแอพของฉันบน wildfly 12 โดยเริ่มต้นเซิร์ฟเวอร์ด้วยพารามิเตอร์ standalone.sh -Dee8.preview.mode = true ตามที่แนะนำในเว็บไซต์ wildfly . ปัญหา "bean ถูกแก้ไขเป็น null" หายไปหลังจากดาวน์โหลด wildfly 13 การอัปโหลดสงครามเดียวกันกับ wildfly 13 ทำให้ทุกอย่างใช้งานได้


1

ฉันติดข้อผิดพลาดนี้เพราะในคลาสที่มี@SpringBootApplicationฉันลืมระบุชื่อแพ็คเกจของคอนโทรลเลอร์

คราวนี้ฉันต้องการให้เจาะจงมากขึ้นเพื่อชี้ให้เห็นว่า Spring ต้องสแกนส่วนประกอบใดบ้างแทนที่จะกำหนดค่าแพ็คเกจพื้นฐาน

มันเป็นเช่นนี้:

@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

ฉันใช้ wildfly 10 สำหรับคอนเทนเนอร์ javaee ฉันประสบปัญหา "ไม่สามารถเข้าถึงเป้าหมาย" เอนทิตี "คืนค่าว่าง" ขอบคุณสำหรับคำแนะนำจาก BalusC แต่ปัญหาของฉันอธิบายได้จากวิธีแก้ปัญหา โดยบังเอิญใช้ "import com.sun.istack.logging.Logger;" แทนที่จะเป็น "import org.jboss.logging.Logger;" ทำให้ CDI ใช้ JSF EL หวังว่าจะช่วยปรับปรุงการแก้ปัญหา


0

ผมมีปัญหาเหมือนกัน. วิธีแก้ปัญหานั้นง่ายกว่ามาก ปรากฏว่า datatable ต้องการเมธอดในรูปแบบ getter คือ getSomeMethod () ไม่ใช่แค่ someMethod () ในกรณีของฉันใน datatable ฉันเรียก findResults ฉันเปลี่ยนวิธีการใน backing bean ของฉันเป็น getFindResults () และใช้งานได้

commandButton ทำงานค้นหาโดยไม่ได้รับซึ่งทำหน้าที่ทำให้สับสนมากขึ้นเท่านั้น


0

สำหรับ # 2 ในกรณีของฉันมันมีชีวิตขึ้นมาอย่างน่าอัศจรรย์หลังจากเปลี่ยน

<body>

แท็กด้วย

<h:body>

หลังจากทำโครงการ JSF หลายโครงการ (ง่ายกว่านั้นจริง ๆ แล้วฉันจำไม่ได้ว่าได้ตั้งค่าอะไรที่แตกต่างออกไปในตอนนี้และฉันได้รับข้อผิดพลาดประเภทนี้เป็นครั้งแรก ฉันกำลังสร้างหน้าเข้าสู่ระบบขั้นพื้นฐาน (ชื่อผู้ใช้รหัสผ่านผู้ใช้ Bean ... ) และตั้งค่าทุกอย่างตามปกติ ความแตกต่างเพียงอย่างเดียวที่ฉันเห็นคือแท็กดังกล่าวข้างต้น อาจมีคนพบว่าสิ่งนี้มีประโยชน์


0

ปัญหาในกรณีของฉันคือฉันรวมตัวสร้างที่รับพารามิเตอร์ แต่ไม่ใช่ตัวสร้างที่ว่างเปล่าพร้อมกับคำอธิบายประกอบแบบฉีดเช่นนั้น

@Inject public VisitorBean() {}

ฉันเพิ่งทดสอบโดยไม่มีตัวสร้างใด ๆ และดูเหมือนว่าจะใช้งานได้เช่นกัน


0

สำหรับ 1. topic ( Target Unreachable, identifier 'bean' ถูกแก้ไขเป็น null );

ฉันตรวจสอบคำตอบที่มีค่าของ @BalusC และผู้แบ่งปันคนอื่น ๆ แต่ฉันเกินปัญหานี้เช่นนี้ในสถานการณ์ของฉัน หลังจากสร้าง xhtml ใหม่ด้วยชื่อที่แตกต่างกันและสร้างคลาส bean ด้วยชื่ออื่นแล้วฉันก็เขียนโค้ด (ไม่คัดลอกวาง) ทีละขั้นตอนไปยังคลาส bean ใหม่และไฟล์ xhtml ใหม่


0

เมื่อฉันลบพารามิเตอร์บริบท AnnotationConfigWebApplicationContext ออกจากไฟล์ web.xml นี่ใช้ได้

หากคุณมีเช่น param ซึ่งตามที่แสดงด้านล่างคุณต้องลบออกจากไฟล์ web.xml

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

สนใจที่จะอธิบายอย่างละเอียดว่าทำไมสิ่งนี้ถึงแก้ได้? หรือทำไมการมีมันทำให้เกิดปัญหา?
Kukeltje

-1

การทำงานกับ JSF ในรูปแบบเก่าคุณต้องกำหนดถั่วที่มีการจัดการในไฟล์ beans-config.xml (อยู่ในโฟลเดอร์ WEB-INF) และทำการอ้างอิงในไฟล์web.xmlด้วยวิธีนี้:

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

(ฉันได้ลองใช้ขอบเขตอื่นแล้ว แต่ ... )

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 และเพิ่มการอ้างอิง mvn: com.sun.faces jsf-api 2.2.11

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

จากนั้นฉันพยายามเปลี่ยนเป็น Primefaces และเพิ่มการพึ่งพาไพรม์เฟซ:

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

ฉันเปลี่ยน xhtml จาก h: เป็น p: เพิ่ม xmlns: p = "http://primefaces.org/ui ลงในเทมเพลตเฉพาะเมื่อใช้ JSF เท่านั้น proyect ก็ทำงานได้และมีการจัดการที่ตกลงมาเมื่อฉันเพิ่ม Primefaces ฉันได้รับวัตถุที่ไม่สามารถเข้าถึงได้ (javax.el.propertynotfoundexception) ปัญหาคือ JSF กำลังสร้าง ManagedBean ไม่ใช่ Primefaces และฉันขอไพรม์เฟซสำหรับวัตถุฉันต้องลบ jsf-im จาก. pom ของฉันล้างและ ติดตั้ง proyect ทั้งหมดตกลงจากจุดนี้หวังว่าจะช่วยได้


2
การสันนิษฐานสาเหตุของปัญหาของคุณไม่สมเหตุสมผล PrimeFaces ไม่ใช่การใช้งาน JSF เลย สิ่งนี้ตรงกับข้อกำหนด"คลาสพา ธ รันไทม์ของคุณสะอาดและไม่มีรายการซ้ำใน JAR ที่เกี่ยวข้องกับ CDI API" กล่าวอีกนัยหนึ่งคลาสพา ธ รันไทม์ของคุณยุ่งเหยิงกับไลบรารีที่ซ้ำกันและ PrimeFaces ก็ขยายเพียงอย่างเดียวไม่ก่อให้เกิด
BalusC

-3

EL ตีความ $ {bean.propretyName} ตามที่อธิบายไว้ - propertyName กลายเป็น getPropertyName () ตามสมมติฐานที่คุณใช้วิธีการสร้าง getter / setters อย่างชัดเจนหรือโดยปริยาย

คุณสามารถแทนที่พฤติกรรมนี้ได้โดยระบุชื่ออย่างชัดเจนว่าเป็นฟังก์ชัน: $ {bean.methodName ()} สิ่งนี้เรียกฟังก์ชันเมธอด Name () โดยตรงโดยไม่ต้องแก้ไข

ไม่เป็นความจริงเสมอไปที่ Accessors ของคุณจะมีชื่อว่า "get ... "


1
นี่ไม่ใช่แนวทางปฏิบัติที่ถูกต้องและทำให้ไม่สามารถเรียกใช้ตัวตั้งค่าที่ถูกต้องหลังส่วนประกอบอินพุตได้ นอกจากนี้ยังไม่สามารถเป็นสาเหตุของข้อยกเว้นดังกล่าวได้ นี้เท่านั้นที่จะทำให้เกิดข้อยกเว้นกล่าวว่าคุณทำผิดพลาดในการอ้างอิงคุณสมบัติในการแสดงออกวิธีการดำเนินการดังกล่าวเป็นแทนaction="#{bean.property}" action="#{bean.method}"
BalusC

ที่น่าทึ่งในโลกของ Java สมัยใหม่ที่มีการเขียนโปรแกรมเชิงฟังก์ชัน "แนวปฏิบัติที่ถูกต้อง" นี้กำลังเปลี่ยนแปลงไป ดูdev.to/scottshipp/… และการอ้างอิงซึ่ง โปรดทราบว่าลอมบอกมีการตั้งค่าสำหรับ "คล่องแคล่ว" โดยที่ไม่มีการเพิ่ม get / set บริษัท ของเรามีวิศวกร 1,000 คนที่ดูเหมือนจะมีมุมมองที่แตกต่างออกไปเกี่ยวกับการปฏิบัติในปัจจุบัน
sdw

1
ฉันคิดว่าคุณและวิศวกร 1,000 คนของคุณกำลังสับสนคุณสมบัติกับวิธีการ
BalusC

แนวปฏิบัติในการออกแบบนี้กลายเป็นเรื่องปกติในแอปพลิเคชันขนาดใหญ่ที่มีความพร้อมกันสูงมาก ฉันขอเสนอว่าการโหวตลงคะแนนของคุณขึ้นอยู่กับมุมมองเดียวของแนวทางการออกแบบแทนที่จะเป็นคุณค่าของคำตอบในการช่วยชุมชนขนาดใหญ่ของเราในการติดตามข้อบกพร่องที่อาจเกิดขึ้น
sdw

1
ฮะ? ขออภัยฉันไม่สามารถเพิกเฉยต่อความประทับใจที่คุณไม่รู้ว่ากำลังพูดถึงอะไร
BalusC

-3

ในกรณีของฉัน "el-ri-1.0.jar" หายไป


1
โดยปกติคุณไม่ต้องการมันเลยดังนั้นจึงมีสิ่งอื่นที่สำคัญ ส่วนใหญ่อาจเป็นคลาสพา ธ รันไทม์ที่สกปรก คุณควรแก้ไขแทนที่จะทำให้แย่ลงในระยะยาวโดยการเพิ่มไลบรารีที่เซิร์ฟเวอร์ควรจัดเตรียมไว้แล้ว
BalusC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.