Kegagalan Pencarian JNDI EJB3 di klien aplikasi Java EE

Saya mencoba mengakses EJB3 dari aplikasi klien Java EE, tetapi tidak mendapatkan apa pun selain kegagalan pencarian. Aplikasi klien berjalan dalam Kontainer Klien Aplikasi Java EE.

Aplikasi Java EE saya 'CoreServer' memperlihatkan sejumlah kacang dengan antarmuka jarak jauh. Saya tidak punya masalah mengaksesnya dari Aplikasi Web yang digunakan pada Glassfish v3.0.1 yang sama.

Sekarang saya mencoba mengaksesnya dari aplikasi klien:

public class Main {

  public static void main(String[] args) {
    CampaignControllerRemote bean = null;

    try {
        InitialContext ctx = new InitialContext();
        bean = (CampaignControllerRemote) ctx.lookup("java:global/CoreServer/CampaignController");

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if (bean != null) {
        Campaign campaign = bean.get(361);
        if (campaign != null) {
            System.out.println("Got "+ campaign);
        }
    }
  }

}

Ketika saya menjalankan penerapannya ke Glassfish dan menjalankannya dari klien aplikasi, saya mendapatkan kesalahan ini:

Lookup failed for 'java:global/CoreServer/CampaignController' in SerialContext targetHost=localhost,targetPort=3700,orb'sInitialHost=localhost,orb'sInitialPort=3700

Namun, itu nama JNDI yang sama persis dengan yang saya gunakan ketika saya mencari kacang dari WebApplication (melalui SessionContext, bukan InitialContext - apakah itu penting?). Juga, ketika saya menggunakan 'CoreServer', Glassfish melaporkan:

Portable JNDI names for EJB CampaignController : [java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote, java:global/CoreServer/CampaignController]
Glassfish-specific (Non-portable) JNDI names for EJB CampaignController : [mvs.api.CampaignControllerRemote, mvs.api.CampaignControllerRemote#mvs.api.CampaignControllerRemote]

Saya mencoba keempat nama, tidak ada yang berhasil. Apakah klien aplikasi tidak dapat mengakses kacang dengan (hanya) antarmuka jarak jauh?


person Hank    schedule 29.04.2010    source sumber
comment
Saya akan merekomendasikan agar Anda beralih menggunakan injeksi ketergantungan untuk kedua kasus penggunaan... (aplikasi web dan klien aplikasi Anda).   -  person vkraemer    schedule 12.05.2010
comment
bagaimana pencarian CORBA dilakukan dengan injeksi ketergantungan pada klien aplikasi? Bisakah Anda lebih spesifik?   -  person Thufir    schedule 11.03.2015


Jawaban (3)


Jika Anda berbicara tentang klien aplikasi, gunakan jawaban ini:

Jangan repot-repot dengan pencarian jndi; Anda dapat menggunakan injeksi @EJB ke dalam bidang statis kelas aplikasi.

person Brian Leathem    schedule 19.05.2010

Sudahkah Anda mencoba java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote alih-alih java:global/CoreServer/CampaignController ?

person Ravindra Gullapalli    schedule 19.05.2010

Jika Anda berbicara tentang klien yang berdiri sendiri, gunakan jawaban ini:

Inilah metode yang saya gunakan untuk pencarian JNDI untuk glassfish v2, mungkin sangat mirip untuk v3:

private void lookupJndi() {
    final Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory");
    String host = "hostname.domain";
    logger.log(Level.INFO, "Connecting to CORBA Host: " + host);
    props.setProperty("org.omg.CORBA.ORBInitialHost", host);
    try {
        InitialContext ic = new InitialContext(props);
        scheduleManager = (ScheduleManagerRemote) ic.lookup("ScheduleManagerRemote");
        experimentManager = (ExperimentManagerRemote) ic.lookup("ExperimentManager");
        facilityManager = (FacilityManagerRemote) ic.lookup("FacilityManager");
    } catch (NamingException e) {
        ...
    }

Bagian kuncinya adalah mendapatkan com.sun INITIAL_CONTEXT_FACTORY. Pastikan juga Anda memiliki semua dependensi glassfish yang dibundel dengan aplikasi Anda. Untuk glassfish v2 ada banyak sekali. Stoples v2 adalah: javaee, appserv-rt, appserv-ext, appserv-admin, appserv-deployment-client.

Segalanya mungkin jauh lebih sederhana dengan v3, tapi ini pasti berfungsi untuk v2.x

person Brian Leathem    schedule 19.05.2010
comment
apakah menggabungkan semua dependensi berbeda dengan menggunakan appclient? - person Thufir; 11.03.2015
comment
@Thufir sudah lama sejak saya melihat ini, tetapi IIRC perbedaannya dengan klien aplikasi dibandingkan dengan klien mandiri adalah bahwa klien aplikasi adalah wadah yang dikelola, instance objek Anda disuntikkan. Kumpulan dependensi terkait jika berbeda untuk dua kasus penggunaan. - person Brian Leathem; 11.03.2015