私は今、自分の解決策を見つけるために何日も検索しました。私の意見では、それほど難しくはありませんが、明らかに解決できない問題です。
いくつかのEJB、Webクライアント(正常に動作)を含むEARプロジェクトがあり、アプリケーションクライアントモジュールを追加しました。
すべてが同じプロジェクトにあるので、アプリケーションクライアントのメインクラスでの単純な@EJBインジェクションで十分だと思いました。JNDIルックアップも試しました。サーバーとしてEclipseとGlassfishを使用し、アプリケーションを実行しようとしました。1. eclipseで(注入されたBeanはnullです)、2。Glassfish管理からclient-stubをダウンロードし、sh appclient -client(または-jar)OmazanClient.jar(およびclient-stubフォルダーに隠されている他の2つの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は現在機能しています。もう1つの問題は、dbクエリがプリミティブ値や文字列ではなくオブジェクトを返すことでした。これによりバッファエラーが発生しました。
ただし、実行中のアプリケーションクライアントを正しくエクスポートする方法についてはまだ混乱しています。多分誰かがアイデアを持っていますか?!