当前位置: 首页 > 知识库问答 >
问题:

在应用程序客户机中使用@EJB注入,两者都在同一个EAR中

衡子安
2023-03-14

我已经找了好几天了,想为我的问题找到一些解决办法,在我看来不是太难,但显然是无法解决的问题。

我有一个EAR项目,其中包含一些EJB、一个web客户机(工作正常),现在我添加了一个应用程序客户机模块。

由于所有内容都在同一个项目中,我认为在应用程序客户机的主类中进行简单的@EJB注入就可以了。我还尝试了JNDI查找。我使用eclipse和glassfish作为服务器,并尝试运行应用程序1。在eclipse中(我的注入bean就是null)和2。从glassfish管理下载了客户端存根,并尝试使用sh appclient-client(或-jar)OmazanClient启动它。jar(以及隐藏在客户机存根文件夹中的另外两个jar)。在那里,我得到的大多是“ClassNotFoundException: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;

}

... 依此类推(接口所需的所有方法都已实现,请尽量缩短)

还有舱单。MF只是

Manifest-Version: 1.0
Main-Class: Main

我尝试过很多类似JNDI查找的方法,比如给bean命名(参见示例)等等。但是要么找不到接口(查找),要么bean就是空的。

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

现在,如果有任何我可能错过的建议,我将不胜感激。

干杯:)

找到了解决办法。不知怎么的,JNDI现在可以工作了。另一个问题是,我的db查询返回的是一个对象,而不是原语值或字符串——这导致了缓冲区错误。

然而,我仍然对如何正确地导出和运行应用程序客户端感到困惑。也许有人有主意?!

共有1个答案

潘坚白
2023-03-14

这里有一个很好的例子:使用Netbeans 6.8和Glassfish V3创建并运行一个JEE6客户端应用程序——第2部分:增强和部署应用程序。它已经有几年历史了,但它确实提供了一个非常好的概述。

 类似资料:
  • 我正在使用Glassfish 4。我有一个耳朵,它有一个战争和一个罐子(与EJB)。 我想从WAR中调用EJB,但不确定是否需要使用本地或远程接口。 在我的罐子里,我的豆子是这样的: 在我的WAR中,我有一个web服务,它看起来如下所示: 这两个都包装成一个耳朵。 当我调用WebService方法时,我得到一个AccessLocalException: 首先: 这是调用EJB的正确方法吗。EAR中

  • 问题内容: 我正在尝试使用@EJB注释注入EJB: 当我在同一个耳朵中将EJB注入另一个EJB时,它可以正常工作。 当我从同一服务器的另一端将EJB注入另一个EJB时,出现异常: EJB在调用方法“ sayHello”期间引发了意外的(未声明的)异常。异常数据:javax.ejb.EJBException:注入失败;嵌套的异常是:com.ibm.ejs.container.EJBNotFoundE

  • 我有两个spring boot应用程序。 模块1在端口8080上运行 模块2在端口9090上运行 我已在应用程序中使用此属性设置端口。属性文件 这两个模块都有/登录/注册,无需通过下面的代码进行身份验证即可访问。 任何其他请求都需要对用户进行身份验证。 如果我一次使用一个模块没有问题, 但是如果尝试同时来回使用它们,那么问题是我每次使用另一个应用程序时都必须再次登录到之前的应用程序。例如。 转到模

  • 导入java.rmi.RemoteException;导入java.util.properties;导入javax.ejb.createException;导入javax.naming.context;导入javax.naming.InitialContext;导入javax.naming.namingException;导入com.brainysoftware.ejb.adder;导入com.b

  • 可能是Tomcat每次停止都要删除/conf/catalina/localhost文件夹下的website.xml文件。 localhost文件夹下的website.xml文件如下所示

  • 我有这个问题,一个应用程序耳朵有这个错误,我是一个weblogic12c的新管理员,有人帮助我吗??? 这是一个标准安装Weblogic 12c