การฉีดทรัพยากรใน cdi bean

ฉันไม่แน่ใจว่าสิ่งนี้ควรจะใช้งานได้หรือไม่ แต่ฉันกำลังพยายามเขียนโปรดิวเซอร์ JMS ด้วย cdi ด้วย wildfly และติดอยู่ที่การฉีดทรัพยากรลงใน bean ที่จัดการ cdi:

public class CdiProducer {
    @Resource(name = "java:jboss/DefaultJMSConnectionFactory")
    @Produces
    QueueConnectionFactory qcf;

    @Resource(name = "java:/queue/HELLOWORLDMDBQueue")
    @Produces
    @Hello
    Queue helloWordQueue;

เรียกใช้สิ่งนี้ ฉันได้รับข้อผิดพลาดต่อไปนี้:

JBAS016076: เกิดข้อผิดพลาดในการฉีดทรัพยากรลงใน bean ที่จัดการโดย CDI ไม่พบทรัพยากรชื่อ ...

สิ่งที่แปลกมากคือเมื่อฉันคัดลอกและวางทรัพยากรลงใน Enterprise Bean ทุกอย่างก็ใช้งานได้!

@Stateless
public class QueueSender {
    @Resource(name="java:jboss/DefaultJMSConnectionFactory")
    QueueConnectionFactory qcf;

    @Resource(name="java:/queue/HELLOWORLDMDBQueue")
    Queue helloWordQueue;

คิวถูกกำหนดเป็น:

  <jms-destinations>
     <jms-queue name="HelloWorldQueue">
        <entry name="/queue/HELLOWORLDMDBQueue"/>
        <entry name="java:jboss/exported/queue/HELLOWORLDMDBQueue"/>
     </jms-queue>
  </jms-destinations>

มันควรจะทำงานแบบนี้เหรอ? หรือเป็นแมลงใน wildfly?


person mglauche    schedule 17.03.2014    source แหล่งที่มา
comment
คุณไม่ควรใช้ @Resource(mappedName=...) ใช่ไหม   -  person Rudi Angela    schedule 18.03.2014
comment
@ฤดี ทำไม? ทรัพยากรควรจะสามารถทำงานกับชื่อ jndi ในเครื่องได้หรือไม่   -  person mglauche    schedule 18.03.2014
comment
ในคำถามของคุณ คุณเขียน JBAS016076: เกิดข้อผิดพลาดในการฉีดทรัพยากรลงใน CDI ที่ได้รับการจัดการ bean ไม่พบทรัพยากรชื่อ ... อย่างไรก็ตาม ดูเหมือนว่าคุณได้ตัดส่วนสำคัญออกไปแล้ว คุณสามารถรวมส่วนสำคัญนี้ได้หรือไม่? มันล้มเหลวใน Queue หรือ ConnectionFactory? นอกจากนี้ หากคุณใช้ WildFly 8 คุณสามารถแทรก JMSContext และหลีกเลี่ยงค่าเริ่มต้นเหล่านี้ได้มากมาย   -  person John Ament    schedule 19.03.2014
comment
@John: ทั้งคู่ล้มเหลวโดยมีข้อความแสดงข้อผิดพลาดเดียวกันดูเหมือนว่าจะสอดคล้องกับทรัพยากรทุกประเภท สำหรับ JMSContext ฉันอยากจะใช้ แต่เราใช้ wildfly เพื่อการพัฒนาในท้องถิ่น ผลิตภัณฑ์ขั้นสุดท้ายจำเป็นต้องปรับใช้บนเว็บสเฟียร์ 8.5 ซึ่งเป็น JEE6/JMS 1.1 เท่านั้น ดังนั้นจึงไม่มี JMSContext :(   -  person mglauche    schedule 19.03.2014


คำตอบ (2)


ฉันไม่มีประสบการณ์โดยตรงกับ Wildfly/JBoss แต่ฉันมีประสบการณ์แบบเดียวกับคุณกับ Glassfish ในกรณีของเรา เราใช้ @PersistenceContext เพื่อแทรก EntityManager แต่ฉันเชื่อว่าใช้กฎเดียวกัน

เอกสารประกอบการเชื่อม มีส่วนเกี่ยวกับการรวม Java ทรัพยากร EE และ CDI มันแสดงให้เห็นว่าคุณสามารถกำหนดฟิลด์ผู้ผลิตได้อย่างไร (อธิบายรายละเอียดเพิ่มเติม ที่นี่) เพื่อเชื่อมต่อทรัพยากรดังกล่าวกับ CDI ในลักษณะที่คุณสามารถใช้ @Inject ที่อื่นได้

ฟิลด์มีความเป็นคู่โดยสามารถเป็นเป้าหมายของการฉีดสภาพแวดล้อมคอมโพเนนต์ Java EE และได้รับการประกาศเป็นฟิลด์ผู้ผลิต CDI ดังนั้น จึงสามารถกำหนดการแมปจากชื่อแบบสตริงในสภาพแวดล้อมส่วนประกอบ ไปจนถึงการผสมผสานประเภทและตัวระบุที่ใช้ในโลกของการฉีด typesafe เราเรียกฟิลด์ผู้ผลิตที่แสดงการอ้างอิงถึงอ็อบเจ็กต์ในสภาพแวดล้อมคอมโพเนนต์ Java EE ว่าทรัพยากร

...

การประกาศทรัพยากรประกอบด้วยข้อมูลสองส่วนจริงๆ ได้แก่ ชื่อ JNDI, ลิงก์ EJB, ชื่อหน่วยการคงอยู่ หรือข้อมูลเมตาอื่นๆ ที่จำเป็นในการขอรับการอ้างอิงไปยังทรัพยากรจากสภาพแวดล้อมของส่วนประกอบ และประเภทและตัวระบุที่เราจะใช้เพื่อแทรกการอ้างอิง ลงในถั่วของเรา

ตัวอย่าง:

@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource") 
@CustomerDatabase Datasource customerDatabase;

ที่อื่น:

@Inject @CustomerDatabase Datasource customerDatabase;

แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจนในหน้านั้น แต่ฉันเชื่อว่าคลาสที่มีฟิลด์นี้จะต้องเป็น Java EE bean กล่าวคือ มีคำอธิบายประกอบด้วยหนึ่งในคำอธิบายประกอบ EJB เช่น @javax.ejb.Stateless หรือ @javax.ejb.Singleton

person andersschuller    schedule 17.03.2014

ไปงานปาร์ตี้สาย แต่ฉันพบปัญหาเดียวกันนี้ เมื่อใช้ @resource บน bean ที่จัดการโดย CDI JNDI จะถูกเติมหน้าด้วย 'java:comp/env/' เสมอ เพื่อแก้ไขปัญหานี้ ฉันเปลี่ยน name เป็น lookup เมื่อใช้ @resource นอก Enterprise Bean

@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
person Jimeh    schedule 14.10.2015