在Application Client中使用@EJB注入,两者都在同一个EAR中

时间:2013-01-08 18:53:33

标签: eclipse dependency-injection glassfish ejb application-client

我现在已经搜索了几天,为我找到了一些解决方案,在我看来并不是太难但显然无法解决的问题。

我有一个包含Some EJB的EAR项目,一个Web客户端(工作正常),现在我添加了一个Application Client Module。

因为一切都在同一个项目中,我认为应用程序客户端的主类中的一个简单的@EJB注入会做。我也尝试过JNDI查找。 我使用eclipse和glassfish作为服务器并试图在eclipse中运行应用程序1.在那里我注入的bean只是null而且2.从glassfish管理器下载了client-stub并试图用sh appclient -client启动它(或-jar)OmazanClient.jar(以及隐藏在client-stub文件夹中的其他两个jar)。我在那里得到的主要是“ClassNotFoundExeption:Main”,如

java.lang.ClassNotFoundException: Main
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at org.glassfish.appclient.client.acc.ACCClassLoader.findClass(ACCClassLoader.java:212)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.glassfish.appclient.client.acc.FacadeLaunchable.getMainClass(FacadeLaunchable.java:262)
at org.glassfish.appclient.client.acc.AppClientContainer.setClient(AppClientContainer.java:324)
at org.glassfish.appclient.client.acc.AppClientContainerBuilder.createContainer(AppClientContainerBuilder.java:185)
at org.glassfish.appclient.client.acc.AppClientContainerBuilder.newContainer(AppClientContainerBuilder.java:172)
at org.glassfish.appclient.client.AppClientFacade.createContainerForAppClientArchiveOrDir(AppClientFacade.java:492)
at org.glassfish.appclient.client.AppClientFacade.createContainer(AppClientFacade.java:454)
at org.glassfish.appclient.client.AppClientFacade.prepareACC(AppClientFacade.java:269)
at org.glassfish.appclient.client.acc.agent.AppClientContainerAgent.premain(AppClientContainerAgent.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338)

因此,对于注入,我的代码如下:

public class Main {
@EJB (mappedName="ejb/customerBean")
public static CustomerInterface customerBean;
@EJB (mappedName="ejb/productBean")
public static ProductInterface productBean;

public static void main(String[] args) {
    try{
        Main m = new Main();
        m.runDialog();
    }
    catch (Exception e){
        e.printStackTrace();
    }

}

/* (non-Java-doc)
 * @see java.lang.Object#Object()
 */
public Main() {
    super();

}
private void runDialog() throws Exception{
    System.out.println("Test");
    List<ProductDTO> productList = productBean.getAllProducts();

...

我的远程界面如下所示:

@Remote
public interface ProductInterface {

public int addProduct(String productName);
public void deleteProduct(int prodid);
public void updateProduct(int prodid, String newName);
List<ProductDTO> getAllProducts();

...

我的实现是:

/**
 * Session Bean implementation productInterface
 *  */
@Stateless(mappedName="ejb/productBean")
@LocalBean
@WebService
public class ProductBean implements ProductInterface {

@EJB ProductEAO eao;
@EJB Conversion conv;

/**
 * Default constructor. 
 */
public ProductBean() {
    // TODO Auto-generated constructor stub
}

@Override
public int addProduct(String prodName) {
    return eao.addProduct(prodName);
}

@Override
public List<ProductDTO> getAllProducts() {

         List<ProductDTO> result = new ArrayList<ProductDTO>();
         List<Product> allProducts = eao.allProducts();
            for (Product pr : allProducts) {
               ProductDTO ci = conv.fromProduct(pr);
                result.add(ci);
            }
            return result;

}

......依此类推(接口所需的所有方法都已实现,只是尝试将其缩短)

和MANIFEST.MF只是

Manifest-Version: 1.0
Main-Class: Main

我尝试了很多像JNDI查找,给出了bean名称(参见示例)等。但是找不到接口(查找)或bean只是null。

我怎么也不太确定如何运行应用程序客户端。我认为glassfishs appclient是正确的起点?它应该是一个控制台交互,所以没有摆动组件或任何类似的东西。

现在我要感谢任何我可能错过的建议。

干杯:)


找到解决方案。不知何故,JNDI现在工作。另一个问题是我的db查询返回了一个Object而不是原始值或字符串 - 这导致了缓冲区错误。

但是,我仍然对如何正确导出应用程序客户端感到困惑。也许有人有想法?!

1 个答案:

答案 0 :(得分:0)

这里有一个很好的例子:Create and Run a JEE6 Client Application with Netbeans 6.8 and Glassfish V3 - Part 2: Enhancing and Deploying the Application。它已经有几年了,但它确实提供了很好的概述。