Question

J'utilise Gilead à persister mes entités dans mon projet GWT et j'ai rencontré un problème. Je voudrais créer une classe mère pour occuper certaines propriétés communes à l'ensemble de mes entités (id, etc.). Lorsque persistant je reçois une exception de pointeur NULL.

Classe parent:

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

classe enfant:

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

Hibernate fichier de 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>

Trace de la pile lors de la persistance:

  

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)

Était-ce utile?

La solution

Utilisez-vous Gilead < 1.2.2?

Si oui, mettez à niveau Gilead . Et puis exécutez à nouveau et vérifier le nouveau message d'exception. Très probablement juste une sorte de mauvaise configuration.

Une explication complète:

Si vous vérifiez le code source de PersistentRemoteService.java dans la version 1.2.1

PersistentRemoteService.java v1.2.1

à la ligne 170, vous voyez la ligne suivante

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

Cela échoue évidemment avec un NullPointerException si rpcRequest est nulle.

Cela se produit lorsque dans la ligne 143

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

Le decodeRequest-Méthode déclenche une IncompatibleRemoteServiceException. Ce qu'il fait dans votre cas.

À partir de la version 1.2.2 de la ligne 170 modifications à

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

Maintenant, vous devriez obtenir la bonne exception (IncompatibleRemoteServiceException) qui vous montre le vrai problème.

Vous pouvez également vérifier le commit / fix correspondant dans SVN

Bad fix exception (numéro 2663344)

et l'entrée d'émission correspondante dans le Bug-Tracker pour Gilead

exception incorrect

Donc, ce problème est résolu dans SVN depuis le 07 Février 2009 ou depuis la version Gilead 1.2.2 (13 Mars 2009)

Autres conseils

Je ne sais pas si ça aide. Juste une spéculation. Avez-vous essayé avec superclasse non abstraite? Parfois, réduire à néant manuellement / chargement avec impatience les références d'objets paresseux ou des listes avant sérialisation (et bien sûr en dehors de la portée des transactions en cours) fonctionne tout simplement, et il n'y a pas besoin de Gilead.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top