Pergunta

Eu estou usando Gilead persistir meus entidades no meu projeto GWT e eu correr em um problema. Eu gostaria de criar uma classe pai para manter algumas propriedades que são comuns ao longo dos meus entidades (id, etc). Quando persistindo eu recebo uma exceção de ponteiro nulo.

classe pai:

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

classe criança:

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

arquivo de mapeamento Hibernate:

<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>

Rastreamento de pilha quando persiste:

Java.lang.NullPointerException em net.sf.gilead.gwt.PersistentRemoteService.processCall (PersistentRemoteService.java:170) em com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost (RemoteServiceServlet.java:86) em javax.servlet.http.HttpServlet.service (HttpServlet.java:754) em javax.servlet.http.HttpServlet.service (HttpServlet.java:847) em org.apache.catalina.core.ApplicationFilterChain.servletService (ApplicationFilterChain.java:427) em org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:315) em org.apache.catalina.core.StandardContextValve.invokeInternal (StandardContextValve.java:287) em org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:218) em org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:648) em org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:593) em com.sun.enterprise.web.WebPipeline.invoke (WebPipeline.java:94) em com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:98) em org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:222) em org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:648) em org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:593) em org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:587) em org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:1096) em org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:166) em org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:648) em org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:593) em org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:587) em org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:1096) em org.apache.coyote.tomcat5.CoyoteAdapter.service (CoyoteAdapter.java:288) em com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter (DefaultProcessorTask.java:647) em com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess (DefaultProcessorTask.java:579) em com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process (DefaultProcessorTask.java:831) em com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask (DefaultReadTask.java:341) em com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask (DefaultReadTask.java:263) em com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask (DefaultReadTask.java:214) em com.sun.enterprise.web.portunif.PortUnificationPipeline $ PUTask.doTask (PortUnificationPipeline.java:380) em com.sun.enterprise.web.connector.grizzly.TaskBase.run (TaskBase.java:265) em com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run (SSLWorkerThread.java:106)

Foi útil?

Solução

Você está usando Gilead < 1.2.2?

Se sim, atualizar Gilead . E depois executar novamente e verifique a nova mensagem de exceção. O mais provável é apenas algum tipo de erro de configuração.

explicação completa:

Se você verificar o código-fonte do PersistentRemoteService.java na versão 1.2.1

PersistentRemoteService.java v1.2.1

na linha 170 você verá a seguinte linha

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

Isto, obviamente, não com um NullPointerException se rpcRequest é nulo.

Isso acontece quando, em linha 143

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

O decodeRequest-Método lança uma IncompatibleRemoteServiceException. O que faz no seu caso.

A partir da versão 1.2.2 da linha 170 muda para

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

Agora você deve obter a exceção direita (IncompatibleRemoteServiceException) que aponta para o problema real.

Você também pode verificar o correspondente cometer / fix no SVN

correção exceção Bad (edição 2.663.344)

e a entrada edição correspondente na Bug-Tracker para Gilead

exceção errada

Portanto, este problema está resolvido no SVN desde 07 fevereiro de 2009 ou desde Gilead versão 1.2.2 (13 de Março 2009)

Outras dicas

Não tenho certeza se isso ajuda. Apenas uma especulação. Você tentou com superclasse não-abstrato? Às vezes, anulando manualmente / ansiosamente carregar referências de objeto preguiçosos ou listas antes de serialização (e de escopo de transação curso fora atual) simplesmente funciona, e não há necessidade de Gilead.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top