использование EJB удаленных интерфейсов вне Main - PullRequest
1 голос
/ 01 ноября 2011

У меня есть приложение 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());
    }
}

это сработало для меня, как и ожидалось. однако, когда я изменил свой app-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 {

    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 Ответ

3 голосов
/ 01 ноября 2011

Руководство по разработке Glassfish гласит:

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

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

...