discuss_ja@glassfish.java.net

NB6.1+SJSAS9.1でMS AccessでのEJB利用は可能?

From: <y_at_sonoda.ac>
Date: Wed, 14 May 2008 16:09:16 +0900

苑田です。

先に質問した件は、JREをJDKに変更することで無事解決したのですが、
いま本題のMS Accessの*.mdbファイルをセッションビーン経由で、webに
表示するテストをしています。

で、どうもうまくいかず、SJSASのログを見てみると、SEVEREが一件
発生しています。

やろうとしていることを簡単に書くと、サーバ・クライアントの構成で、
サーバに*.mdbファイルがあり、このmdbのなかの一つのテーブルの
内容をクライアント側のwebブラウザに一覧表示する、というものです。
とりあえずwebブラウザや、クライアントソフトからこのmdbファイルに
データを追加したり、更新したりする予定は無く、単に現在のデータが
表示できればそれでokです。
(更新処理などをやろうとすると、jdbc.odbc経由だとJTAにちゃんと対応してない
からかいろいろと問題がある旨の情報はネットで見つけました。今回は閲覧だけ
なので、問題はないのではないかと考えていますが)

SJSASの肝心のSEVEREログはメールの末尾につけるとして、現在の
設定を可能な限り以下に記したいと思います。

※一部、クラス名やページ名などを実際のものと若干違うものに書き直して
 いますので、書き直しの抜けやミスがあって一貫性の無い部分があるかも
 しれません。

(0)環境
 サーバ:
   Windows Server 2005
   JDK1.6_06
   SJSAS9.1_01
 クライアント:
   Windows XP sp2
   JDK1.6_06
   NB6.1英語版(日本語パッチあて済み)

(1)サーバのデータソース設定
Winの
  「コントロールパネル/管理ツール/データソース(ODBC)」
にて、
  名称:GDMDB
  ドライバ:Driver do Microsoft Access (*.mdb)
で登録しています。

(2)SJSASの管理コンソール設定
 SJSASのj管理コンソールの
  「リソース/JDBC/接続プール」
にて
  名前:GDMDBPool
  データソースクラス:sun.jdbc.odbc.JdbcOdbcDriver
  リソースクラス:javax.sql.DataSource
  [追加プロパティ]にて
  Url: jdbc:odbc:GDMDB
  User: <username>
  Password: <password>
  おまけに以下のプロパティも加えています。
  toplink.jdbc.url : jdbc:odbc:GDMDB
  toplink.jdbc.user : <username>
  toplink.jdbc.password : <password>
  toplink.platform.class.name :
oracle.toplink.essentials.platform.database.AccessPlatform
  toplink.ddl-generation : none (既存*.mdbの閲覧のみなので)
を設定しています。

(3)SJSASの管理コンソール設定
 SJSASのj管理コンソールの
  「リソース/JDBC/JDBCリソース」
にて、
  JNDI名:jdbc/GDMDBDS (適当につけています)
  プール名:GDMDBPool (上記(2)で追加したプールを指定しています)

とりあえずSJSAS側の設定としてはこれだけです。

つぎにNB側のソースの方ですが、以下のとおりです。

EJBモジュールプロジェクト:GDMTest1-ejbを作成し

(4)エンティティクラスを2つ作成

  GDMData.java (@Entityアノテーションのあるもの)
  GDMDataKey.java (複合キー用に@Embeddableしているもの)

---------------------GDMData.javaの中身(抜粋)---------------------------------
import java.io.Serializable;
import java.sql.Date;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;

@Entity(name = "GDC_IMAGE_DATA")
public class GDMData implements Serializable {

    public GDMImageData() {
    }
        :
    @EmbeddedId
    private GDMDataKey gdmIDataKey;

    public GDMDataKey getGdmDataKey() {
        return gdmImageDataKey;
    }

    public void setGdmDataKey(GDMDataKey gdcDataKey) {
        this.gdmDataKey = gdcDataKey;
    }
       :
    @Column(name = "PAGE")
    private int page;

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }
        :
}

-------------------------GDMDataKey.java
の中身-------------------------------------
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class GDMDataKey implements Serializable {

    public GDMImageDataKey() {
    }

    private String orderNo;
    @Column(name="ORDER") <-----ここでNBは"!"を表示してる。
    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderno) {
        this.orderNo = orderno;
    }
                :
}
-------------------------------------------------------------------------------------------------------

(5)セッションエンティティを作成

  インタフェース:GDMOperator.java
  クラス:GDMOperatorBean.java

-----------------GDMOperator.javaの中身-----------------------------------------------------
import GDMDataEntityPackage.GDMImageData;
import java.util.List;

public interface GDMOperator {

    public int getImageData();
    public List<GDMImageData> listImageData();
            :
}

-----------------GDMOperatorBean.javaの中身--------------------------------------------------
import GDMDataEntityPackage.GDMData;
import java.io.Serializable;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;

@Remote
@Stateless
@PersistenceContext(unitName = "GDMDB-PU")
public class GDMOperatorBean implements GDMOperator, Serializable {

    private EntityManager em;

    public GDMOperatorBean() {
    }

    @Override
    public int getImageData() {
        return 0;
    }

    @Override
    public List<GDMData> listData() {
        Query q = em.createQuery("SELECT e FROM GDMData e");
        List<GDMData> imageData = (List<GDMData>) q.getResultList();
        return imageData;
    }
                  :
}
-------------------------------------------------------------------------------------------------------

(6)persistence.xml
上記ejbプロジェクトのpersistence.xmlを下記のように定義
---------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="GDMDB-PU" transaction-type="JTA">
    <jta-data-source>jdbc/GDMDBDS</jta-data-source>
    <class>GDMDataEntityPackage.GDMData</class>
                                     :
                                     :
    <properties/>
  </persistence-unit>
</persistence>
------------------------------------------------------------------------------------------------------------

webプロジェクト:GDMTest1-warを作成

(7)表示用のjspを作成

------------------------------------ListImage.jspの中身-------------------------------------

<%_at_page contentType="text/html"%>
<%_at_page pageEncoding="UTF-8"%>
<%_at_page import="javax.naming.InitialContext" %>
<%_at_page import="java.util.List" %>
<%_at_page import="GDMDataEntityPackage.GDMData" %>
<%_at_page import="GDMDataEntityPackage.GDMIDataKey" %>
<%_at_page import="GDMSessionEntityPackage.GDMOperator" %>

<%
            request.setCharacterEncoding("UTF-8");
            InitialContext ctx = new InitialContext();
            GDMOperator bean1 =
                    (GDMOperator) ctx.lookup(GDMOperator.class.getName());
            List<GDMData> gdmData = bean1.listData();
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>リスト表示</title>
    </head>
    <body>

        <h1>リスト表示(test-10)</h1>

        <%
            if (gdmData == null) {
                out.println("gdmData:データがありませんでした。");

            } else {
                for (GDMData imgdata : gdmData) {
                    out.println(imgdata.getNameH());
                    out.println("<br>");
                }
            }

        %>
    </body>
</html>
--------------------------------------------------------------------------------------------------

(8)上記webプロジェクトのsun-web.xml

---------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD
Application Server 9.0 Servlet 2.5//EN"
"http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
  <context-root>/GDMTest-web</context-root> ←設定したのはここくらい
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="classdebuginfo" value="true">
      <description>生成されたサーブレットクラスでのデバッグ情報のコンパイルを可能にします</description>
    </property>
    <property name="mappedfile" value="true">
      <description>静的内容と生成されたサーブレットクラスの Java コード間の 1 対 1 の対応を維持します</description>
    </property>
  </jsp-config>
</sun-web-app>
---------------------------------------------------------------------------------------------

(9)上記ListData.jspに下記urlにてアクセス

http://172.*.*.*:12080/GDMTest-web/ListData.jsp

※ちなみに同じフォルダにindex.html, test.jspという2つのシンプルな
ページデータを用意しており、それぞれは下記URLにて表示できることを確認済み

http://172.*.*.*:12080/GDMTest-web/inex.html
http://172.*.*.*:12080/GDMTest-web/test.jsp

==========================================================

という環境で、(9)のページを表示すると下記のような画面がwebブラウザに
表示されます。

-----------------------------------------------------------------------------------------------------------------
HTTP Status 500 -

--------------------------------------------------------------------------------

type 状態レポート

メッセージ

説明The server encountered an internal error () that prevented it from
fulfilling this request.


--------------------------------------------------------------------------------

Sun Java System Application Server 9.1_01
-------------------------------------------------------------------------------------------------------------------

(10)SJSASのSEVEREログ

上記(9)を表示した直後にSJSASに残るSEVEREログを以下に添付します。

---------------------------------------------------------------------------------------------------------
タイムスタンプ 2008/05/14 13:53:44.538
ログレベル SEVERE
ロガー javax.enterprise.system.container.web
名前と値のペア _ThreadID=17;_ThreadName=httpSSLWorkerThread-12080-2;_RequestID=688126eb-31e2-4cc6-bbed-c1c6c28481ce;
レコード番号 1963
メッセージ ID StandardWrapperValve[jsp]
メッセージ全文 PWC1406: サーブレット jsp の Servlet.service() が例外をスローしました
javax.ejb.EJBException: nested exception is: java.rmi.ServerException:
RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
java.lang.NullPointerException java.rmi.ServerException:
RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
java.lang.NullPointerException at
com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:243)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
at GDMSessionEntityPackage.__GDMOperator_Remote_DynamicStub.listData(GDMSessionEntityPackage/__GDMOperator_Remote_DynamicStub.java)
at GDMSessionEntityPackage._GDMOperator_Wrapper.listData(GDMSessionEntityPackage/_GDMOperator_Wrapper.java)
at org.apache.jsp.ListImage_jsp._jspService(ListImage_jsp.java from
:66) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:93)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:470)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:364)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at
org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:290)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: java.rmi.RemoteException: null; nested exception is:
java.lang.NullPointerException at
com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:251)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
at $Proxy46.listData(Unknown Source) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597) at
com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
... 38 more Caused by: java.lang.NullPointerException at
GDMSessionEntityPackage.GDMOperatorBean.listData(GDMOperatorBean.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597) at
com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
... 51 more javax.ejb.EJBException: nested exception is:
java.rmi.ServerException: RemoteException occurred in server thread;
nested exception is: java.rmi.RemoteException: null; nested exception
is: java.lang.NullPointerException at
GDMSessionEntityPackage._GDMOperator_Wrapper.listData(GDMSessionEntityPackage/_GDMOperator_Wrapper.java)
at org.apache.jsp.ListImage_jsp._jspService(ListImage_jsp.java from
:66) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:93)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:470)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:364)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at
org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:290)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
--------------------------------------------ここまで--------------------------------------------------------------

まずは問題の切り分けをと思っているのですが、上記ログからでは、
Windowsのodbcデータソースの設定に問題があるのか、
SJSASのデータソース、JDBCリソースの設定問題があるのか、
エンティティ・セッションビーンの記述に問題があるのか、
はたまた、ListData.jspの記述に問題があるのか、
良く分かりません。

nested exception と NullPointerExceptionが発生しているのは
上記ログから見て取れますが、それがどこで何の理由で発生しているのかを
よみとれず、結果としてトラブルシュートできずに困っております。

エキスパートの方々のご助言を得られれば幸いに存じます。

よろしくお願いいたします。