1

*NIX上のEclipseEEを介してOracleGlassFish3.1.2へのWARファイルの標準的なデプロイメント手順を解読しようとしています。JNDIルックアップ文字列のを取得しjava.lang.ClassCastExceptionています(私が知る限り)。助言がありますか?

JNDIルックアップ文字列:Object objref = ctx.lookup("java:comp/env/");

SEに関するいくつかの投稿では、次の使用を推奨していますctx.lookup("java:comp/env/ejb/<mapped name>") 。So:Object objref = ctx.lookup( "java:comp / env / Exchange"); `

  • 'ejb'は何を意味しますか?これは内部のJava固有の識別子ですか、それともユーザーランドディレクトリですか?

http://localhost:8080/Exchange/エラーをスローするためにナビゲートする:

java.lang.ClassCastException: com.sun.enterprise.naming.impl.JavaURLContext cannot be cast to org.omg.CORBA.Object

スタックトレース

[#|2013-02-13T10:26:01.507-0500|WARNING|oracle-glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=73;_ThreadName=Thread-2;|StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: com.sun.enterprise.naming.impl.JavaURLContext cannot be cast to org.omg.CORBA.Object
    at com.sun.corba.ee.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:245)
    at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:153)
    at org.apache.jsp.ExchangeClient_jsp._jspService(ExchangeClient_jsp.java:87)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)
|#]

ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>Exchange</ejb-name>
      <home>ejb.ExchangeHome</home>
      <remote>ejb.ExchangeObject</remote>
      <ejb-class>ejb.ExchangeBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
  </enterprise-beans>
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>Exchange</ejb-name>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
</ejb-jar>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Exchange</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>ExchangeClient.jsp</welcome-file>
  </welcome-file-list>  
</web-app>

ExchangeClient.jsp

<%@page import="ejb.*" %>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.rmi.PortableRemoteObject" %>

<!DOCTYPE HTML>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Currency Converter</title>
        <link rel="stylesheet" href="master.css" />
    </head>
    <body>
        <h1>WAR</h1>

        <section id="user_input">
            <form action="ExchangeClient.jsp" method="POST">
                <label>Amount</label>   <input type="text" name="initial_amount" size="16" placeholder="0.00" pattern="^([.0-9])" required/><BR>
                <label>From</label> <input type="text" name="base_trigram" size="16" placeholder="CAD" pattern="^([A-Z])" required/>
                <label>To</label>   <input type="text" name="destination_trigram" size="16" placeholder="USD" pattern="^([A-Z])" required/>

                <button id="submit" type="submit">Submit</button>   
                <button id="reset" type="reset">Clear</button>   
            </form>
        </section>

        <section id="result">
            <%!ExchangeObject exchange; %>
            <%
            String amount = request.getParameter("initial_amount");
            String from = request.getParameter("base_trigram");
            String to = request.getParameter("destination_trigram");

            Context ctx = new InitialContext(); 
            Object objref = ctx.lookup("java:comp/env/");
            ExchangeHome home = (ExchangeHome)PortableRemoteObject.narrow(objref, ExchangeHome.class);

            ExchangeObject exchange = home.create();
            out.println(exchange.convert(amount, from, to));
            out.println(exchange.getExchangeRate());
            out.println(exchange.getExchangeRateTimestamp());
            %>
        </section>
    </body>
</html>

foo@Machine ~/workspace $ tree Exchange
Exchange
├── build
│   └── classes
│       └── ejb
│           ├── ExchangeBean.class
│           ├── ExchangeHome.class
│           └── ExchangeObject.class
├── src
│   └── ejb
│       ├── ExchangeBean.java
│       ├── ExchangeHome.java
│       └── ExchangeObject.java
└── WebContent
    ├── ExchangeClient.jsp
    ├── META-INF
    │   └── MANIFEST.MF
    └── WEB-INF
        ├── lib
        │   └── ejb-jar.xml
        └── web.xml
4

1 に答える 1

1

こんにちは、EJBサーバーには、JNDIサーバーと呼ばれるものがあります。

JNDIサーバーは難解です。これは、EJBをデプロイすると、デプロイヤーがJNDIツリーにエントリーを作成して新しいEJB(ejb / MyEjbなど)を参照することを意味します。

したがって、MyEJBを使用するには、「ejb/MyEjb」という名前を使用して実装を探す必要があります。

ctx.lookup("java:comp/env/ejb/ejb/MyEjb")

使用してみてください

ctx.lookup("java:comp/env/ejb/Exchange");

それが機能しない場合は、サーバーのjndiツリーを参照して、Exchangeへの正しいパスに置き換えてみてください

詳細については、 http://docs.oracle.com/javase/tutorial/jndi/concepts/index.htmlを参照してください。

よろしく、

于 2013-02-14T12:39:37.870 に答える