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)

È stato utile?

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

eccezione sbagliato

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top