我现在已经搜索了几天,为我找到了一些解决方案,在我看来并不是太难但显然无法解决的问题。
我有一个包含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而不是原始值或字符串 - 这导致了缓冲区错误。
但是,我仍然对如何正确导出应用程序客户端感到困惑。也许有人有想法?!
答案 0 :(得分:0)
这里有一个很好的例子:Create and Run a JEE6 Client Application with Netbeans 6.8 and Glassfish V3 - Part 2: Enhancing and Deploying the Application。它已经有几年了,但它确实提供了很好的概述。