ギリアドを使用して、継承を持つクラスを永続
質問
私はGWTプロジェクトで私のエンティティを永続化するギレアデを使用していると私は問題に遭遇しました。私は私のエンティティ(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>
持続スタックトレースます:
のjava.lang.NullPointerException net.sf.gilead.gwt.PersistentRemoteService.processCallで(PersistentRemoteService.java:170) com.google.gwt.user.server.rpc.RemoteServiceServlet.doPostで(RemoteServiceServlet.java:86) javax.servlet.http.HttpServlet.serviceで(HttpServlet.java:754) javax.servlet.http.HttpServlet.serviceで(HttpServlet.java:847) 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) 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) org.apache.catalina.core.ContainerBase.invokeで(ContainerBase.java:1096) org.apache.coyote.tomcat5.CoyoteAdapter.serviceで(CoyoteAdapter.java:288) 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.web.connector.grizzly.DefaultProcessorTask.processで(DefaultProcessorTask.java:831) com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTaskで(DefaultReadTask.java:341) com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTaskで(DefaultReadTask.java:263) 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)で
解決
あなたはギリアドの <の1.2.2?
を使用していますをはいた場合は、ギリアドのアップグレード。そして、再度実行して、新しい例外メッセージを確認してください。設定ミスの可能性が最も高いだけのいくつかの種類ます。
の完全な説明:の
あなたがバージョン1.2.1にPersistentRemoteService.javaのソースコードをチェックする場合は、
<のhref = "http://gilead.svn.sourceforge.net/viewvc/gilead/gilead/tags/gilead-1.2.1/adapter4gwt/src/net/sf/gilead/gwt/PersistentRemoteService.java?リビジョン= 402&ビュー=マークアップ」のrel = "nofollowをnoreferrer"> PersistentRemoteService.java V1.2.1 の
ライン170であなたは次の行を参照してください。
return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());
これは明らかにNullPointerException
がnullの場合rpcRequest
で失敗します。
この起こること
// Decode request
rpcRequest = RPCCopy.getInstance().decodeRequest(payload, this.getClass(), this);
decodeRequest
-方法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で修正/コミット対応を確認することができます<のhref = "http://gilead.svn.sourceforge.net/viewvc/gilead/gilead/branches/1.2/adapter4gwt/src/net/sf/gilead/gwt/PersistentRemoteService.java?r1=394&r2= 599" のrel = "nofollowをnoreferrer">悪い例外修正(問題2663344)の
とギレアデの用バグトラッカーに対応発行エントリP>
の 間違った例外
だから、この問題は、2009年2月7日以来、SVNで解決されたか、ギリアドバージョン1.2.2(2009年3月13日)以来の
他のヒント
それが助けかどうかわかりません。ただ、投機。あなたは、非抽象スーパークラスにしてみてくださいましたか?時には、手動だけで動作し、ギリアドする必要はありません熱心にシリアライズする前に、怠惰なオブジェクト参照やリストを読み込む/無効化(そしてもちろん、現在のトランザクションの範囲外)。