javax.ejb.EJBException:嵌套异常是:java.rmi.UnmarshalException:找不到方法:'helloWorld(Ljava.lang.Long; Ljava.util.List;)'

时间:2014-08-14 16:20:19

标签: java weblogic ejb-3.0

在weblogic(10.2)上运行EJB3应用程序时获取异常

javax.ejb.EJBException: nested exception is: java.rmi.UnmarshalException: Method not 
found: 'helloWorld(Ljava.lang.Long;Ljava.util.List;)'

我创建了一个方法,作为那些有用的东西的精确副本。不过这个方法    没用。

我的业务界面具有以下定义

  public abstract interface MySession {
  // .. some other methods here, which works fine
  /**
   * Returns .... something
   *
   * @param theId ...
   *
   * @throws MyException If ...something happens
   *
   * @ejb.interface-method
   */
    public String helloWorld(Long theId, List<String>list) throws MyException;

My Bean实现类

 @Stateless(mappedName="ejb.TaxSession")
 @Remote(TaxSession.class)
 public  class MySessionEJB implements MySession {
      @javax.persistence.PersistenceContext(unitName="myDS")
      private EntityManager m_SCSentityManager ;

      //.. some methods that work ... (defined in a same fashion as the bad one ..
    /**
 * Returns tax details from tblDiscreteTaxcollected by BillID
 *
 * @param theId ...
 *
 * @throws MyException If something wrong..
 *
 * @ejb.interface-method
 */
  public String helloWorld(Long theId, List<String>list) throws MyException{
     String returnValue = "Hello world !!" ;

     return returnValue ;
  }

 }

这是一个客户端代码(JUnit 4):

 @Test
public final void taxesByWtns() {
System.out.println("Test taxation started...");
long theId= 1111222;

List<String> theList= new ArrayList<String>();
theList.add("test1");
theList.add("test2");
theList.add("test3");

try {
    System.out.println(getTaxSession().helloWorld(theId, theList));

} catch (MyException e) {
    System.out.println("EXCEPTION HAS OCCURED !!") ; 
    e.printStackTrace();
} catch (NamingException e) {
    System.out.println("EXCEPTION HAS OCCURED !!") ;
    e.printStackTrace();
}
}

我检查了ear文件,看到那个方法就在那里。在此之前,我的方法在第一个参数中有“long”而不是“Long”,而在ear文件中,我只能看到第二个参数。我收集它与序列化有关。所以我改为Long - 现在两个参数都出现了(在ear文件中)。但是,“找不到方法......”的异常仍然出现..

陷阱在哪里? (我按照类似帖子的建议安装,更新并重新安装了几次部署 - 无济于事:()

由于

2 个答案:

答案 0 :(得分:1)

可能是MyException类型的问题。确保客户端和服务器端具有MyException类型,并且它满足远程调用的要求(Serializable)。

另一个问题是远程接口的类型为TaxSession而不是MySession。

@Stateless(mappedName="ejb.TaxSession") @Remote(TaxSession.class) --> not MySession

但是

 public  class MySessionEJB implements MySession

您确定提供了拥有所声明方法的正确远程接口吗? 在MySession界面中。检查服务器日志以获取EJB部署输出。

答案 1 :(得分:0)

我解决了这个问题。如果有人遇到同样的问题,这里有详细信息

在我的代码中,我使用了泛型!!

public String helloWorld(Long theId, List<String>list) throws MyException{}

有一次,我删除了它 - 它开始工作正常。 不知道它背后的理论概念是什么,但它有效!!