Pergunta

Eu tenho um serviço RPC com o seguinte método:

public List<Serializable> myMethod(TransactionCall call) {...}

Mas recebo um aviso quando esse método é analisado, e então a chamada RPC falha

Analyzing 'my.project.package.myService' for serializable types
Analyzing methods:
public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call)
Return type: java.util.List<java.io.Serializable>
[...]
java.io.Serializable
Verifying instantiability
(!) Checking all subtypes of Object wich qualify for serialization

Parece que não posso usar serializável para minha lista ... Eu poderia usar minha própria interface (algo como asyncdatainterface, que implementa a interface serializável), mas o fato é que meu método retornará uma lista objetos personalizados e objetos básicos (como como como cordas, int ....).

Então, minhas perguntas são:

  • É um comportamento independente? (Não consigo descobrir por que não posso usar essa interface nesse caso)
  • Alguém tem uma solução alternativa para esse tipo de situação?
Foi útil?

Solução

Ao passar objetos através da chamada RPC, é uma boa prática declarar os tipos de parâmetros de concreto na interface RPC. Se, por algum motivo, você não puder usar classe de concreto na interface RPC, tente ser o mais específico possível.

Isso ocorre porque o compilador GWT, ao emitir JavaScript, deve levar em consideração todas as variantes possíveis da lista na unidade de compilação. Isso inclui todas as classes que estendem a lista e a interface serializável no caminho da classe. As permutações podem ser enormes, o que afetará seu tempo de compilação e o tamanho do download do aplicativo.

Portanto, a melhor abordagem é definir sua interface como

public ArrayList<YourType> myMethod(TransactionCall call) {...}

ao invés de

public List<Serializable> myMethod(TransactionCall call) {...}

Dessa forma, o compilador precisa gerar unidades de compilação apenas para extensões ArrayList e YourType. O Benifit está em tempos de compilação mais rápidos e arquivos JavaScript menores compilados, portanto, downloads mais rápidos do seu aplicativo.

Caso você deva retornar uma ampla gama de objetos não relacionados na sua chamada RPC, tente criar uma classe de wrapper e retornar o objeto da classe Wrapper com o valor de retorno embrulhado. Use a classe Wrapper na definição do método RPC. Resista ao desejo de declarar o campo embrulhado como objeto ou serializável, você negará todos os benefícios de serialização obtidos usando um invólucro. Em vez disso, você pode definir uma interface de wrapper e um pequeno conjunto de implementação do wrapper para cada tipo de concreto que você deseja retornar através da sua chamada RPC.

Outras dicas

Você pode verificar se o arquivo de política de serialização não é a fonte do problema.

Citação da documentação GWT:

No entanto, há uma condição para permitir o suporte ao Java.io.Serializable no novo sistema GWT RPC.

O RPC agora gera um arquivo de política de serialização durante a compilação GWT. O arquivo de política de serialização contém uma lista de permissões de tipos permitidos que podem ser serializados. Seu nome é um nome de hash forte, seguido por .gwt.rpc. Para permitir o suporte ao Java.io.Serializable, os tipos que seu aplicativo enviará sobre o fio devem ser incluídos na lista de permissões da política de serialização. Além disso, o arquivo de política de serialização deve ser implantado no seu servidor da Web como um recurso público, acessível a partir de um controle de serviço via servletContext.getResource (). Se não for implantado corretamente, o RPC será executado no modo de compatibilidade 1.3.3 e se recusará a serializar tipos que implementam Java.io.Serializable.

Eu não vejo o ponto de definir listau003CSerializable> como o valor de retorno. O tipo serializável não fornece informações adicionais na declaração da API de serviço. O GWT fará a verificação de serialização no tempo de execução de qualquer maneira.

No seu caso, onde os elementos da lista não têm ancestral comum além do objeto, eu usaria a listau003C?> .

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