【问题标题】:RMI call with Remote interface at ejb 3 in weblogic在 weblogic 中的 ejb 3 上使用远程接口进行 RMI 调用
【发布时间】:2023-03-07 06:27:03
【问题描述】:

当我尝试调用远程接口时,此代码有一些问题,即部署在其他服务器 (prewlsapp2) 中。 这是我的客户:

Hashtable<String, String> pro = new Hashtable<String, String>();  
              //Properties pro = new Properties();  
              pro.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");  
               pro.put(Context.PROVIDER_URL, "t3://prewlsapp2:7661");  
               //pro.put(Context.SECURITY_PRINCIPAL, "hemanth");  
              //pro.put(Context.SECURITY_CREDENTIALS, "hemnathn1"); 


               Context ctx = new InitialContext(pro);  
               MessagesEntityFacadeRemote t = (MessagesEntityFacadeRemote)ctx.lookup("MessagesEntityFacade#Message.MessagesEntityFacadeRemote");
               GOSIDebug.debugMessages("MessagesEntityFacadeRemote  "+t);
              List tt = t.findByTargetID("2004");

               System.out.print("xyz");

System.out.print("xyz");调用 t.findByTargetID("2004") 后从未打印,也没有打印异常!

我的远程界面是:

    package Message;

import java.util.List;
import javax.ejb.Remote;

@Remote
public interface MessagesEntityFacadeRemote {

    void create(MessagesEntity messagesEntity); 

    void edit(MessagesEntity messagesEntity);

    void remove(MessagesEntity messagesEntity);

    MessagesEntity find(MessagesEntity id);

    List<MessagesEntity> findAll();

     List<MessagesEntity> findByTargetID(String target) ;

    List<MessagesEntity> findRange(int[] range);

     MessagesEntity findByMessageID(String target);

      List<MessagesEntity> findNextByTargetID(String target,int f,int l) ;

    int count();

}

也是我的Impl:

package Message;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(mappedName="MessagesEntityFacade")
public class MessagesEntityFacade implements MessagesEntityFacadeLocal, MessagesEntityFacadeRemote, Serializable {
    @PersistenceContext(unitName = "Messaging_SystemPU")
    private EntityManager em;


    protected EntityManager getEntityManager() { 
        return em;
    }



    @Override
    public MessagesEntity find(MessagesEntity id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    @Override
    public List<MessagesEntity> findAll() {

    return em.createQuery("select object(o) from MessagesEntity as o").getResultList();

    }



    @Override
        public List<MessagesEntity> findByTargetID(String target) throws Exception  {


        System.out.println("target are"+target);
        Query result=null;
        try{
       ArrayList <MessagesEntity>listOFMessages=new ArrayList<MessagesEntity>();
       List results = new ArrayList();
       MessagesEntity[] users;
       System.out.print("hiiiiiiiiiii");
            result = em.createNativeQuery("select * from T_MESSAGES  p where p.target = ?1 order by p.creationtimestamp desc",Message.MessagesEntity.class);
        System.out.print("out hiiiiiiii");
        result.setParameter(1, target);


        // results = result.getResultList();

      //  System.out.print("beforrrrrr");
            // users = (MessagesEntity[])result.getResultList().toArray(new MessagesEntity[0]);
       //  System.out.println("usersusers"+users);



        }
        catch(Exception e){
            System.out.print("xxxxxxxxxxxxxxxs"); 
            e.printStackTrace();
        }

         return result.getResultList();

    //SELECT c from PolicyShiftEntityEJB c where c.policyId = :policyId
      /*Query query=em.createQuery("SELECT object(c) FROM MessagesEntity as c WHERE  c.target = :target order by c.messageid desc");
      query.setParameter("target", target);
      List res= query.getResultList();

      System.out.print("ressssssss"+res);
        listOFMessages.addAll(res);

        return listOFMessages;*/
     // return query.getResultList();

    }

    @Override
    public MessagesEntity findByMessageID(String messageId) {

        Query result = em.createNativeQuery("select * from T_MESSAGES  p where p.messageid = ?1 ",Message.MessagesEntity.class);
        result.setParameter(1, messageId);
        return (MessagesEntity) result.getSingleResult();

    }

    @Override
    public List<MessagesEntity> findNextByTargetID(String target,int f,int l) {

        Query result = em.createNativeQuery("select * from T_MESSAGES  p where p.target = ?1 order by p.creationtimestamp desc",Message.MessagesEntity.class);
         result.setParameter(1, target);
         result.setFirstResult((f - 1) * l);
         result.setMaxResults(l);
         return result.getResultList();
    }

    @Override
    public void create(MessagesEntity messagesEntity) {
       em.persist(messagesEntity);
    }

    @Override
    public void edit(MessagesEntity messagesEntity) {
        em.merge(  messagesEntity);
    }

    @Override
    public void remove(MessagesEntity messagesEntity) {
     em.remove(em.merge(messagesEntity));
    }

    @Override
    public List<MessagesEntity> findRange(int[] range) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int count() {
        throw new UnsupportedOperationException("Not supported yet.");
    }


}

提示:当我尝试在我的客户端 (count()) 中调用此函数时,异常是:

 java.lang.reflect.UndeclaredThrowableException
    at $Proxy334.count(Unknown Source)
    at gosi.core.security.viewcontrollers.LoginServlet.doPost(LoginServlet.java:1062)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:502)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:251)
    at gosi.core.security.viewcontrollers.SIMISLoginProxyServlet.doPost(SIMISLoginProxyServlet.java:124)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3495)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Caused by: java.lang.NoSuchMethodException: Message.MessagesEntityFacade_lpk28i_MessagesEntityFacadeRemoteImpl_1030_WLStub.count()
    at java.lang.Class.getMethod(Class.java:1605)
    at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.getTargetMethod(RemoteBusinessIntfProxy.java:162)
    at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:53)
    ... 25 more

但是当我调用这个函数 findByTargetID(String target) 时,什么也没有打印出来!而且我不知道是否有一些异常,而且我的客户中的这一行从未打印过System.out.print("xyz");,非常感谢:)

【问题讨论】:

    标签: java jakarta-ee jms rmi


    【解决方案1】:

    我不确定您使用的是哪个版本的 WebLogic,但在 10.3 中,我们曾经在通过远程调用执行 EJB 时遇到类似问题,并且在远程接口中使用泛型是导致问题的原因。尝试从接口中删除泛型类型参数,看看是否适合您。

    List<MessagesEntity> findByTargetID(String target) ;
    

    变成

    List findByTargetID(String target) ;
    

    【讨论】:

    • 非常感谢,我做了更改,现在错误是:Caused by: java.lang.NoSuchMethodException: Message.MessagesEntityFacade_lpk28i_MessagesEntityFacadeRemoteImpl_1030_WLStub.findByTargetID(java.lang.String)
    • 据我记得,您应该可以拥有本地接口和泛型实现,而不是远程接口中的泛型。您可能必须从 WebLogic 目录中清除已编译的 EJB 类(确切位置现在我不知道,但我认为该目录称为 EJBCompiler 或类似名称)。 WebLogic 并不总是检测到 EJB 已更改并强制重新编译。如果这确实解决了您的问题,您可以接受答案吗?干杯
    • 谢谢你的帮助,关于泛型的问题,weblogic有一个bug,所以你不能做远程接口泛型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多