使用Main之外的EJB远程接口

时间:2011-11-01 07:47:08

标签: java-ee glassfish ejb-3.1

我有一个使用maven3 glassfish3和javaee6的hello-world风格的java ee应用程序。

我有一个简单的会话bean:

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工件。

我写了这个简单的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 {

    @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 个答案:

答案 0 :(得分:3)

glassfish开发指南说:

  

主类和可选回调支持注释   应用程序客户端中的处理程序类。

所以,要么在主类中注入bean,要么构建某种单例注册表,其中所有类都将获得对EJB的引用,或者使用JNDI获取对bean的引用,或者使用一些依赖注入框架(Spring,Guice等),它将有自己的注入规则,并将使用注册表或JNDI作为EJB引用的工厂。

相关问题