2011-12-09 10 views
1

他のサーバー(prewlsapp2)に配置されているリモートインターフェイスを呼び出そうとしているときに、このコードに問題があります。 これは私のクライアントです:リモートインターフェイスを使用したRMI呼び出し(weblogicのejb 3)

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)と呼びますが、何もないprinテッド!私のクライアントのこのラインは印刷されませんでした。

答えて

1

使用しているWebLogicのバージョンはわかりませんが10.3では、リモート呼び出しを使用してEJBを実行した場合と同様の問題が発生していましたが、Remoteインタフェースのジェネリックスが問題の原因となっていました。インタフェースからジェネリック型のパラメータを削除し、それがあなたに適しているかどうかを確認してください。

List<MessagesEntity> findByTargetID(String target) ; 

すなわち

List findByTargetID(String target) ; 
+0

になり、私は変更を加えた、どうもありがとう、今の誤差は ':java.lang.NoSuchMethodException:によって引き起こさMessage.MessagesEntityFacade_lpk28i_MessagesEntityFacadeRemoteImpl_1030_WLStub.findByTargetID( java.lang.String) ' – aldeheme

+0

ジェネリックでローカルインターフェイスと実装を持ち、リモートインターフェイスにジェネリックスを持たないのは覚えています。コンパイル済みのEJBクラスをWebLogicディレクトリからクリアする必要があるかもしれません(正確な場所が私を今からエスケープしますが、そのディレクトリはEJBCompilerなどと呼ばれています)。 WebLogicは、EJBが変更されたことを常に検出するとは限りませんし、再コンパイルを強制します。これで問題が解決しない場合は、その答えを受け入れてください。乾杯、 – dpmatheson

+0

助けてくれてありがとう、ジェネリックに関する問題、weblogicのバグがあるので、あなたはリモートのインターフェイスをジェネリックにすることはできません。 – aldeheme

関連する問題