0

我正在使用 Gilead 将我的实体保留在我的 GWT 项目中,但我遇到了一个问题。我想创建一个父类来保存一些在我的实体中通用的属性(id 等)。坚持时,我得到一个空指针异常。

父类:

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) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at com.sun .enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java :648) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 在 org.apache.catalina.core 的 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)。 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 在 org.apache.catalina.core.StandardPipeline 的 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) .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。 com.sun.enterprise.web.connector.grizzly 上的 web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)。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)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

您使用的是吉利德< 1.2.2 吗?

如果是,升级吉利德。然后再次运行并检查新的异常消息。很可能只是某种错误配置。

完整解释:

如果查看 1.2.1 版本的 PersistentRemoteService.java 的源代码

PersistentRemoteService.java v1.2.1

在第 170 行,您会看到以下行

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

NullPointerException如果 ifrpcRequest为空,这显然会失败。

这发生在第 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)

以及Gilead 的 Bug-Tracker中的相应问题条目

错误异常

所以这个问题自 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 回答