использование удаленных интерфейсов EJB вне основного

#jakarta-ee #glassfish #ejb-3.1

#джакарта-ee #glassfish #ejb-3.1

Вопрос:

У меня есть приложение Java ee в стиле hello-world, использующее maven3 glassfish3 и javaee6.

У меня есть простой сеансовый компонент:

 package com.mytest.beans;

import com.mytest.interfaces.HelloBeanRemote;
import javax.ejb.Stateless;

@Stateless
public class HelloBean implements HelloBeanRemote{

    @Override
    public String sayHello() {
        return "well hello there";
    }
}
 

он предоставляет удаленный интерфейс. этот интерфейс находится в том же модуле, но в другом пакете.

 package com.mytest.interfaces;

import javax.ejb.Remote;

@Remote
public interface HelloBeanRemote {

    public String sayHello();

}
 

Я использую maven-ejb-plugin для создания артефакта ejb-client, от которого зависит мой клиентский модуль.

Я написал это простое приложение-клиент

 package com.mytest;

import com.mytest.interfaces.HelloBeanRemote;
import java.awt.Container;
import javax.ejb.EJB;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * Enterprise Application Client main class.
 *
 */
public class Main {

    @EJB
    private static HelloBeanRemote hb;

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = frame.getContentPane();
        JButton button = new JButton("i have not been pushed");
        pane.add(button);
        frame.pack();
        frame.setVisible(true);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
        }
        button.setText(hb.sayHello());
    }
}
 

это сработало для меня, как и ожидалось. однако, когда я изменил свое приложение-клиент на это:

 package com.mytest;

import com.mytest.interfaces.HelloBeanRemote;
import java.awt.Container;
import javax.ejb.EJB;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * Enterprise Application Client main class.
 *
 */
public class Main {

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = frame.getContentPane();
        MyButton button = new MyButton("i have not been pushed");
        pane.add(button);

        frame.pack();
        frame.setVisible(true);
    }
}
 

 package com.mytest;

import com.mytest.interfaces.HelloBeanRemote;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.ejb.EJB;
import javax.swing.JButton;


public class MyButton extends JButton implements ActionListener{

    @EJB
    private HelloBeanRemote hb;

    public MyButton(String string){
        super(string);
        addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        setText(hb.sayHello());
    }

}
 

это не будет работать должным образом, когда я нажимаю кнопку.

Может кто-нибудь, пожалуйста, просветите меня!

Большое вам спасибо.

Ответ №1:

В руководстве по разработке glassfish говорится:

Аннотации поддерживаются для основного класса и необязательного класса обработчика обратного вызова в клиентах приложений.

Итак, либо вы вводите компоненты в основной класс и создаете какой-то одноэлементный реестр, где все классы будут получать ссылку на EJB, либо вы используете JNDI для получения ссылки на компонент, Либо вы используете некоторую среду внедрения зависимостей (Spring, Guice и т. Д.), Которая будетимеет свои собственные правила внедрения и будет использовать реестр или JNDI в качестве фабрики для ссылок EJB.