Persistono le classi con ereditarietà usando Gilead
Domanda
sto usando Gilead a persistere i miei soggetti nel mio progetto GWT e ho incontrato un problema. Mi piacerebbe creare una classe genitore per tenere alcune proprietà che sono comuni durante i miei soggetti (id, ecc). Quando persistente ricevo un'eccezione di puntatore nullo.
classe padre:
public abstract class Entity extends LightEntity implements Serializable {
protected Long id;
public Entity(){}
}
Classe Child:
public class Person extends Entity {
private String firstName;
private String lastName;
public Person(){}
}
Hibernate file di mapping:
<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>
traccia dello stack quando persiste:
java.lang.NullPointerException a net.sf.gilead.gwt.PersistentRemoteService.processCall (PersistentRemoteService.java:170) a com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost (RemoteServiceServlet.java:86) a javax.servlet.http.HttpServlet.service (HttpServlet.java:754) a javax.servlet.http.HttpServlet.service (HttpServlet.java:847) a org.apache.catalina.core.ApplicationFilterChain.servletService (ApplicationFilterChain.java:427) a org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:315) a org.apache.catalina.core.StandardContextValve.invokeInternal (StandardContextValve.java:287) a org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:218) a org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:648) a org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:593) a com.sun.enterprise.web.WebPipeline.invoke (WebPipeline.java:94) a com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:98) a org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:222) a org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:648) a org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:593) a org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:587) a org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:1096) a org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:166) a org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:648) a org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:593) a org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:587) a org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:1096) a org.apache.coyote.tomcat5.CoyoteAdapter.service (CoyoteAdapter.java:288) a com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter (DefaultProcessorTask.java:647) a com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess (DefaultProcessorTask.java:579) a com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process (DefaultProcessorTask.java:831) a com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask (DefaultReadTask.java:341) a com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask (DefaultReadTask.java:263) a com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask (DefaultReadTask.java:214) a com.sun.enterprise.web.portunif.PortUnificationPipeline $ PUTask.doTask (PortUnificationPipeline.java:380) a com.sun.enterprise.web.connector.grizzly.TaskBase.run (TaskBase.java:265) a com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run (SSLWorkerThread.java:106)
Soluzione
Stai usando Gilead < 1.2.2?
Se sì, aggiornare Gilead . E quindi eseguire nuovamente e verificare il nuovo messaggio di eccezione. Molto probabilmente solo una sorta di errori di configurazione.
spiegazione completa:
Se si controlla il codice sorgente di PersistentRemoteService.java nella versione 1.2.1
PersistentRemoteService.java v1.2.1
alla linea 170 che si vede la seguente riga
return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());
Questo ovviamente fallisce con un NullPointerException
se rpcRequest
è nullo.
che si verifica quando in linea 143
// Decode request
rpcRequest = RPCCopy.getInstance().decodeRequest(payload, this.getClass(), this);
Il decodeRequest
-metodo genera IncompatibleRemoteServiceException
. Cosa che fa al vostro caso.
A partire dalla versione 1.2.2 alla linea 170 modifiche
if (rpcRequest != null)
{
return RPCCopy.getInstance().encodeResponseForFailure(null, ex, rpcRequest.getSerializationPolicy());
}
else
{
return RPCCopy.getInstance().encodeResponseForFailure(null, ex);
}
Ora si dovrebbe ottenere l'eccezione destra (IncompatibleRemoteServiceException
), che si indica il vero problema.
È inoltre possibile controllare il / fix corrispondente impegnarsi in SVN
Bad eccezione correzione (problema 2.663.344)
e la voce numero corrispondente nella Bug-Tracker per Gilead
Quindi, questo problema è risolto in SVN dal 7 feb 2009 o dal Gilead versione 1.2.2 (13 marzo 2009)
Altri suggerimenti
Non sono sicuro se aiuta. Solo una speculazione. Hai provato con superclasse non astratta? A volte dirimente manualmente / avidamente il caricamento di riferimenti a oggetti pigri o gli elenchi prima di serializzazione (e, naturalmente, al di fuori ambito della transazione corrente) solo funziona, e non v'è alcuna necessità di Gilead.