injeksi sumber daya dalam cdi bean

Saya tidak yakin apakah ini bisa berhasil, tetapi saya mencoba menulis produser JMS dengan cdi dengan wildfly dan terjebak dalam menyuntikkan sumber daya ke dalam kacang yang dikelola cdi:

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

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

Menjalankan ini saya mendapatkan kesalahan berikut:

JBAS016076: Kesalahan saat memasukkan sumber daya ke dalam kacang yang dikelola CDI. Tidak dapat menemukan sumber daya bernama ...

Namun yang sangat aneh adalah, ketika saya menyalin & menempelkan sumber daya ke dalam kacang perusahaan, semuanya berfungsi!

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

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

Antrian didefinisikan sebagai:

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

Apakah ini seharusnya bekerja seperti ini? Atau apakah ada bug pada lalat liar?


person mglauche    schedule 17.03.2014    source sumber
comment
Bukankah Anda seharusnya menggunakan @Resource(mappedName=...)?   -  person Rudi Angela    schedule 18.03.2014
comment
@Rudi Kenapa? Sumber daya harus dapat bekerja dengan nama jndi lokal?   -  person mglauche    schedule 18.03.2014
comment
Dalam pertanyaan Anda, Anda menulis JBAS016076: Kesalahan saat menyuntikkan sumber daya ke kacang yang dikelola CDI. Tidak dapat menemukan sumber daya bernama ... namun Anda tampaknya telah memotong bagian penting. Bisakah Anda memasukkan bagian penting ini? Apakah gagal di Queue atau ConnectionFactory? Selain itu, jika Anda menggunakan WildFly 8, Anda cukup memasukkan JMSContext dan menghindari banyak default ini.   -  person John Ament    schedule 19.03.2014
comment
@John: Keduanya gagal, dengan pesan kesalahan yang sama, tampaknya konsisten dengan semua jenis sumber daya. Sedangkan untuk JMSContext, saya ingin menggunakannya, tetapi kami menggunakan wildfly untuk pengembangan lokal, produk akhir perlu diterapkan pada websphere 8.5, yaitu JEE6/JMS 1.1 saja, jadi tidak ada JMSContext :(   -  person mglauche    schedule 19.03.2014


Jawaban (2)


Saya tidak punya pengalaman langsung dengan Wildfly/JBoss, tapi saya punya pengalaman yang sama seperti Anda dengan Glassfish. Dalam kasus kami, kami menggunakan @PersistenceContext untuk menyuntikkan EntityManager, tapi saya yakin aturan yang sama berlaku.

Dokumentasi pengelasan memiliki bagian tentang menyatukan Java Sumber daya EE dan CDI. Ini menunjukkan bagaimana Anda dapat menentukan bidang produser (dijelaskan secara lebih rinci di sini) untuk menghubungkan sumber daya tersebut ke CDI sedemikian rupa sehingga Anda dapat menggunakan @Inject di tempat lain.

Bidang memiliki dualitas yaitu keduanya dapat menjadi target injeksi lingkungan komponen Java EE dan dinyatakan sebagai bidang penghasil CDI. Oleh karena itu, mereka dapat menentukan pemetaan dari nama berbasis string di lingkungan komponen, hingga kombinasi tipe dan kualifikasi yang digunakan dalam dunia injeksi aman tipe. Kami menyebut bidang produser yang mewakili referensi ke objek di lingkungan komponen Java EE sebagai sumber daya.

...

Deklarasi sumber daya sebenarnya berisi dua informasi: nama JNDI, tautan EJB, nama unit persistensi, atau metadata lain yang diperlukan untuk mendapatkan referensi ke sumber daya dari lingkungan komponen, serta jenis dan kualifikasi yang akan kita gunakan untuk memasukkan referensi ke dalam kacang kita.

Contoh:

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

Di tempat lain:

@Inject @CustomerDatabase Datasource customerDatabase;

Meskipun tidak disebutkan secara eksplisit di halaman itu, saya yakin kelas yang berisi bidang ini harus berupa kacang Java EE, yaitu dianotasi dengan salah satu anotasi EJB seperti @javax.ejb.Stateless atau @javax.ejb.Singleton.

person andersschuller    schedule 17.03.2014

Terlambat ke pesta, tapi saya mengalami masalah yang sama. Saat menggunakan @resource pada kacang yang dikelola CDI, JNDI selalu diawali dengan 'java:comp/env/'. Untuk memperbaikinya saya mengubah name menjadi lookup saat menggunakan @resource di luar kacang perusahaan.

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