0

GWT プロジェクトでエンティティを永続化するために Gilead を使用していますが、問題が発生しました。エンティティ全体で共通のプロパティ (id など) を保持する親クラスを作成したいと考えています。永続化すると、null ポインター例外が発生します。

親クラス:

public abstract class Entity extends LightEntity implements Serializable {
    protected Long id;
    public Entity(){}
}

子クラス:

public class Person extends Entity  {
    private String firstName;
    private String lastName;
    public Person(){}
}

ハイバネート マッピング ファイル:

<hibernate-mapping>
    <class name="com.domain.Entity" abstract="true" >
        <id name="id" type="long">
                <column name="ID"/>
                <generator class="native" />
            </id>
        <union-subclass name="com.domain.Person" table="PERSON">
            <property name="id" type="long" />
            <property name="firstName" type="string">
                <column name="FIRST_NAME" length="45" not-null="true" />
            </property>
            <property name="lastName" type="string">
                <column name="LAST_NAME" length="45" not-null="true" />
            </property>
        </union-subclass>
    </class>
</hibernate-mapping>

永続化時のスタック トレース:

net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:170) での java.lang.NullPointerException com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) での javax. servlet.http.HttpServlet.service(HttpServlet.java:754) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315) で org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) で org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:218) org.apache.catalina.core.StandardPipeline で。doInvoke(StandardPipeline.java:648) org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) com.sun .enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java) :648) org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) で org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) で org.apache.catalina.core. ContainerBase.invoke(ContainerBase.java:1096) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) で org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) で org.apache.catalina.core.StandardPipeline .invoke(StandardPipeline.java:587) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) at com. sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) com.sun.enterprise com.sun.enterprise.web.connector.grizzly の web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)。com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) の DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask( DefaultReadTask.java:214) com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380) com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java: 265) com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) でenterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380) com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) com.sun.enterprise.web. connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380) com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) com.sun.enterprise.web. connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

4

2 に答える 2

3

Gilead < 1.2.2 を使用していますか?

はいの場合、ギリアドをアップグレードします。そして、再度実行して、新しい例外メッセージを確認してください。ほとんどの場合、ある種の設定ミスです。

完全な説明:

バージョン1.2.1のPersistentRemoteService.javaのソースコードを確認すると

PersistentRemoteService.java v1.2.1

170行目に、次の行が表示されます

return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());

これは明らかにNullPointerExceptionif rpcRequestis null で失敗します。

それは143行目にあるときに起こります

// Decode request
rpcRequest = RPCCopy.getInstance().decodeRequest(payload, this.getClass(), this);

-MethoddecodeRequestは をスローしIncompatibleRemoteServiceExceptionます。それはあなたの場合に行います。

バージョン 1.2.2 から、170 行目が次のように変わります。

if (rpcRequest != null)
{
  return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());
}
else
{
    return RPCCopy.getInstance().encodeResponseForFailure(null, ex);
}

IncompatibleRemoteServiceExceptionこれで、実際の問題を指摘する適切な例外 ( ) が得られるはずです。

SVN で対応するコミット/修正を確認することもできます

不正な例外の修正 (問題 2663344)

ギリアドのバグトラッカーの対応する問題エントリ

間違った例外

したがって、この問題は、2009 年 2 月 7 日以降、または Gilead バージョン 1.2.2 (2009 年 3 月 13 日) 以降の SVN で解決されています。

于 2009-10-10T12:55:43.193 に答える
0

それが役立つかどうかはわかりません。ただの推測です。非抽象スーパークラスで試しましたか? シリアル化する前に (そしてもちろん現在のトランザクション スコープ外で) 手動で無効化/遅延オブジェクト参照またはリストの読み込みを手動で行うだけでうまくいく場合があり、Gilead の必要はありません。

于 2009-10-10T12:45:44.023 に答える