EJB调用varargs方法失败了Java7客户端

时间:2015-01-06 07:47:10

标签: ejb-3.0

我们有无状态会话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);

但有没有办法让它在不改变方法签名的情况下工作?

是否有任何已知问题?

感谢。

1 个答案:

答案 0 :(得分:0)

您描述的问题是来自WebLogic的旧错误的结果。

实际上,使用varargs的 EJB方法在生成其存根类时会被忽略。 深层原因是WebLogic EJB编译器错误地尝试将transient修饰符附加到varargs参数。
显然,它会导致错误,因此,不会生成方法存根。

当时BEA为WebLogic 10.0.MP1创建了一个路径CR327275来纠正问题。不幸的是,这个补丁显然 包含在WebLogic 10.3版本中......

关于这一点的反馈并不容易找到,但是Seam社区做了一些。他们在这里:

所以,要解决你的问题:

  • 或者,正如您猜测的那样,您必须更改方法签名
  • 或者您联系WebLogic以获取并安装以前的修补程序。

此致 托马斯