使用 Gilead 保留带有继承的类
题
我正在使用 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.glead.gwt.persistremoteservice.processcall(persistentremoteservice.java:170)上servlet.http.httpservlet.service(httpservlet.java:754)at Javax.servlet.http.httpservlet.service(httpservlet.java:847) at org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:315)onorg.apache.catalina.core.condardcontextvalve.indardcontextvalve.invokeinternals(standardcontcontextvalve.java.java:287:287) (standardContextvalve.java:218)atorg.apache.catalina.core.candardpipeline.doinvoke(standardpipeline.java:648)at org.apache.catalina.core.core.concore.standardpipipeline.doinvoke.doinvoke.doinvoke(standardpipeline.java.java:593) Enterprise.web.webpipeline.invoke(webpipeline.java:94)com.sun.enterprise.web.web.pesessionlockingsessionlockingstandardpipeline.invoke(pesessionlockingstoctinglockingstaildpipeline.java:98)at orggace.catalina.core.core.core.core.core.core.core.core.comesjastvalve.instrve.instrve.instrve.instvalve.instrve.instrve.instrve.instrve.instrve.invakes: 222)at org.apache.catalina.core.cansardpipeline.doinvoke(standardpipeline.java:648)org.apache.catalina.core.candardpipeline.doinvoke(standardpipeline.java:593) 。 apache.catalina.core.contardpipeline.doinvoke(standardpipeline.java:648)at org.apache.catalina.core.condardpipeline.doinvoke(standardpipeline.java:593)on org.apache.apache.catalina.core.core.core.core.core.core.candardpipeline.istarther.intarther.inveline(sandartspeline.inveline)( java:587)atorgace.apache.catalina.core.cortainerbase.invoke(containerbase.java:1096)at org.apache.coyote.tomcat.tomcat5.coyoteadeadapter.coyoteadapter.server.servite.servise.servise.service.servise(coyoteadapter.java:288) 。 。 (defaultreadtask.java:263)访问com.sun.enterprise.web.connector.grizzly.defaultreadtask.dotask.dotask(defaultreadtask.java:214) :380)在com.sun.enterprise.web.connector.grizzly.taskbase.run(taskbase.java:265)上,请com.sun.enterprise.web.connector.grizzlizzlizzly.ssl.ssl.ssl.ssl.sslworkerthrew.run(sslworkerthread.106.java:106:106 )
解决方案
你在用吉利德吗 < 1.2.2?
如果是,请升级吉利德. 。然后再次运行并检查新的异常消息。很可能只是某种配置错误。
完整解释:
如果查看1.2.1版本的PersistentRemoteService.java的源代码
PersistentRemoteService.java v1.2.1
在第 170 行,您会看到以下行
return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());
这显然失败了 NullPointerException
如果 rpcRequest
一片空白。
这发生在第 143 行
// 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中查看对应的commit/fix
以及相应的问题条目 吉利德错误追踪器
所以这个问题自2009年2月7日或Gilead版本1.2.2(2009年3月13日)起在SVN中得到解决
其他提示
不知道是否有帮助。只是一个猜测。你尝试与非抽象超?有时手动抵消/串行化只是工作(当然外面当前事务范围的)之前热切加载懒惰对象引用或列表,并且也没有必要对基列。