我们有无状态会话bean(EJB 3.0),它有一个接受varargs(变量参数)作为输入的方法。方法签名如下: -
public String operation1(String arg1,List ... arg4);
此EJB部署在运行于" Java6"上的Weblogic 10.3.2上。 JRE。
从Java6独立客户端调用此EJB方法时,调用成功。 当我将JRE从Java6更改为Java7(不更改任何其他客户端代码)时,调用失败并出现解组异常(下面的堆栈跟踪)。
javax.ejb.EJBException: Could not unmarshal method ID; nested exception is:
java.rmi.UnmarshalException: Method not found: 'operation1(Ljava.lang.String;Ljava.util.List...;)'; nested exception is: java.rmi.UnmarshalException: Method not found: 'operation1(Ljava.lang.String;Ljava.util.List...;)'
at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.unwrapRemoteException(RemoteBusinessIntfProxy.java:109)
at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:91)
at com.sun.proxy.$Proxy5.operation1(Unknown Source)
at com.MyEJBStandaloneClient.testOperation1(MyEJBStandaloneClient.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
EJB代码
@Stateless(mappedName = "MyBean")
public class MyBean implements MyBeanRemote{
public String operation1(String arg1,List...arg4) {
System.out.println("Input1 is:-"+arg1);
return "newString";
}
}
远程课程
@Remote
public interface MyBeanRemote {
public String operation1(String arg1,List... arg4);
}
从Java7客户端&成功调用同一EJB中的非varargs方法(如果有的话)。只有EJB中的varargs方法才会出现这个问题。
请注意,如果Remote接口类上的方法签名更改为以下内容,即使使用Java7,同一调用也能正常工作
public String operation1(String arg1,List[] arg4);
但有没有办法让它在不改变方法签名的情况下工作?
是否有任何已知问题?
感谢。
答案 0 :(得分:0)
您描述的问题是来自WebLogic的旧错误的结果。
实际上,使用varargs的 EJB方法在生成其存根类时会被忽略。
深层原因是WebLogic EJB编译器错误地尝试将transient
修饰符附加到varargs参数。
显然,它会导致错误,因此,不会生成方法存根。
当时BEA为WebLogic 10.0.MP1创建了一个路径CR327275
来纠正问题。不幸的是,这个补丁显然 包含在WebLogic 10.3版本中......
关于这一点的反馈并不容易找到,但是Seam社区做了一些。他们在这里:
所以,要解决你的问题:
此致 托马斯