-
Notifications
You must be signed in to change notification settings - Fork 329
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GsonSerializer Erro include/exclude #933
Comments
mas esse search está retornando null? Se não, vc não precisa colocar esse "list" na frente dos atributos, ele vai aplicar nos elementos da lista. |
O search funciona sem problemas, só estou com dificuldade com o include e
|
Tentou tirar o "list."? |
Sim também da erro, veja que no .from() tenho um objeto, além de alguns Em 30/01/2015 01:27, "Lucas Cavalcanti" [email protected] escreveu:
|
Lucas, vi que tem outra issue aberta na versão 3 do VRaptor, o problema é o mesmo que estou enfrentando. caelum/vraptor#438 |
Opa @jeancrbecker, dei uma olhada agora. Com o mesmo cenário que você, |
Ahhh, esqueci de perguntar. Qual a versão do VRaptor que você está usando? |
@Turini mas você serializou a partir de um objeto "container" ? Veja que quando eu serializo uma lista no .from() funciona sem problemas o acesso à suas propriedades, acontece o erro quando eu tenho um objeto, digamos pessoa, e esse objeto pessoa tem uma lista de telefones por exemplo, quando tento fazer |
eu escrevi o código que você postou aqui na issue:
com as mesmas classes que você postou aqui tb |
Pode me enviar ou me passar um link de um projeto de testes padrão vraptor ? Ai posso usar como base para escrever o teste com meu problema. Acho que fica mais fácil para eu te passar. |
essa sua |
o link do projeto de testes que pediu: |
@Turini https://drive.google.com/folderview?id=0BxIx81dIEEMdbTZoLU8zVzJDNzg&usp=sharing subi uma simulação do erro. |
oi @jeancrbecker, baixei aqui o projeto e o problema é que você faz:
No primeiro include, do "telefones", ele já poe o "tipo". Tirando o segundo
Vai ver que ele funciona tb. adiciona todos os campos do telefone, menos o tipo. |
@Turini estranho pq aqui se eu faço
O teste da erro e o json resultado não contém o "tipo"
|
ah, entendi! É que faltou o
É que o tipo é uma outra classe, por padrão só o |
@Turini Esse é o problema eu não posso usar o recursive(), esse é só um exemplo básico, mas no meu projeto o objeto tem vários níveis, então vai acabar caindo em referencia circular ou mesmo onerando o tempo devido ao excesso de dados desnecessários. |
@Turini, pelo que entendi do caso do @jeancrbecker, acho que ele pode fazer: Assim como o @jeancrbecker, eu costumo não usar o |
Quando tento fazer include do "tipo" ele da o erro abaixo:
|
Sua lista não está com o tipo de objeto definido:
Tenta com o abaixo que deve funcionar:
|
Ah, muda também o seu atributo dentro da classe pessoa:
|
Ai que está o problema, não posso definir tipo. Eu estou fazendo um módulo genérico pra evitar o DRY, ja consegui desenvolver toda a parte de controller e serviços genéricos para CRUD, agora o objeto que vai carregar as listas repassar para o result serializar via JSON para minha app Angular não sabe qual é a tipagem da lista. Vi que quando tem a tipagem realmente eu consigo fazer o include do "telefones.tipo", será que tem alguma ideia de como posso ter o mesmo comportamento sem a tipagem ? |
Entendi, @jeancrbecker. Na verdade eu também já tive esse problema que você está comentando. Mas também acho que seria uma feature interessante permitir objetos genéricos. |
Pois é, senão vou ter que criar um container diferente para cada tipo de objeto que vier do banco para mandar pra tela, ai o DRY vai comer solto rsrs. |
É sim. Agora entendi o problema. @jeancrbecker, por favor corrige a descrição da |
@Turini O exclude quando é lista generica também nao funciona. |
quando você diz genérica, quer dizer sem o generics então, né? :) tipo |
ou você está fazendo com |
@Turini Pior que não consigo senão vou ter que escrever um container para cada objeto, mas aí estaria fazendo o Ctrl+c Ctrl+v o que não acho muito legal, esse list teria que ser mesmo genérico. |
Dá para usar uma annotation que nem o Hibernate usava antes, para suportar @onetomany(targetEntity = Telefone.class) Claro que devemos criar outra annotation... Acho até uma feature justa :). Em Thu Feb 19 2015 at 11:43:54 AM, jeancrbecker [email protected]
|
[Off-topic] Eu evito serializar as entidades, pois, dependendo da alteração, ela pode quebrar os meus JSONs. E, provavelmente, você vai ter que ficar caçando aonde você deve fazer include e aonde você deve fazer exclude. Por isso eu crio wrappers específicos para cada tipo de JSON que eu pretendo serializar. Essa classe vai ser usada apenas para ser serializada: @Entity
public class Company {
private Long id;
private String name;
private String address;
private List<Customer> customers;
private List<BankAccount> accounts;
} Se eu quiser serializar a Company para retornar apenas o id, nome e address para uma determinada view, eu crio o seguinte: public class SomeViewCompanyWrapper {
private final Long id;
private final String name;
private final String address;
public SomeViewCompanyWrapper(Company c) {
this.id = c.getId();
this.name = c.getName();
this.address = c.getAddress();
}
} Assim, posso serializar o objeto e, só vou alterá-lo quando eu precisar alterar a minha view. No caso da lista, poderia ficar assim: public class OtherViewCompanyWrapper {
private final Long id;
private final String name;
private final List<OtherViewCustomerWrapper> customers;
public SomeViewCompanyWrapper(Company c) {
this.id = c.getId();
this.name = c.getName();
this.customers = toWrapper(c.getCustomers());
}
private List<OtherViewCustomerWrapper> toWrapper(List<Customer> customers) {
// Implementação.
return new ArrayList<>();
}
} Assim, posso usar o recursive() sem medo de que tem coisa a mais ou de que minha performance vai ser prejudicada. |
@rafaelGuerreiro Esse é exatamente o caso, esse é um Wrapper especifico para um JSON meu que monta tabelas, ele é genérico justamente porque é exatamente igual para todos meus objetos básicos, muda apenas o conteúdo da lista, por isso preciso dos includes e excludes que tenho parametrizados e bem desacoplados em cada controller, sem essa correção da issue vou ter que criar o mesmo objeto para cada entidade minha do banco, imagine só que bonito o código. ResultadoPessoa.class, ResultadoEndereco.class, ResultadoBairro.class, ResultadoEtc.class... todos com os mesmos campos apenas sendo diferenciados pela tipagem da lista. |
Mas você não está colocando a entidade na lista? Não seria ideal fazer um wrapper genérico para essa lista? Algo assim: private final List<ResultadoWrapperOfList> list; public class ResultadoWrapperOfList {
// Atributos das entidades que devem ser usados da mesma forma
public ResultadoWrapperOfList (Object o) {
// Carrega os atributos. pode usar algum framework de mapeamento
}
} Logo, você vai poder usar o |
@rafaelGuerreiro Não pois a responsabilidade de montar a tabela é da view(AngularJS), de acordo com a view ela sabe quais campos estão vindo e se ocupa de montar a tabela. Uma view pode ter a tabela com o campo Nome e outra não, então cairia no mesmo problema, teria que ter um wrapper para cada tipo de objeto que fosse serializado na lista o que não é ideal. Já tenho a arquitetura funcionando sem problemas, só esbarro no problema de que por não funcionar o include/exclude dos campos da lista quando preciso mandar um campo de relacionamento ele não vai para view, exemplo: está indo todos os dados para montar a tabala de bairro, mas não tenho na view o relacionamento com o campo Cidade para exibir na tabela. |
Como o @Turini disse, tente usar algum type na lista. Você pode usar algo assim: public class Resultado<T> {
private List<T> lista;
} Assim, você pode setar o tipo da lista na hora de instanciar o Resultado... Vai ficar meio esquisito: Resultado<Customer> r = new Resultado<Customer>(company); // Usando as minhas classes mencionadas acima... Talvez você consiga resolver se fizer isso: public class Resultado {
private List<? extends Object> lista;
} Você já tentou fazer isso? |
@asouza Acho que essa anotação não resolveria o problema do @jeancrbecker, pois ele não tem como saber qual será o tipo da Collection. Como não conseguimos mudar o valor do parâmetro da annotation em runtime, acredito que a saída mais plausível seria usar o Generic Type mesmo... Acho que essa anotação serveria para manter compatibilidade com códigos legados em que não fizeram o uso do Generic Type, é essa a sua ideia? |
@rafaelGuerreiro tentei usar com "? extends Object" mas também não funcionou, só funciona quando coloco explicitamente List por exemplo. Com Generic Type também não rolou. |
Pessoal, |
Pois é @nhada o projeto do VRaptor parece estar meio abandonado, não tive retorno também. |
@jeancrbecker e @nhada estamos trabalhando nisso e traremos uma solução o mais rápido o possível. |
@jeancrbecker, perdão pela demora. Tirei a label de bug, porque esse é o comportamento esperado mesmo, já que a informação genérica é essencial pro include/exclude do serializador funcionar nesses casos. Pra ajudar com o seu caso de uso, mandei um pull request #961 aumentando a visibilidade de um método da classe @Specializes
public class CustomSerializee extends Serializee {
@Override
protected static Class<?> getActualType(Field field) {
if (field.isAnnotationPresent(GenericType.class)) {
return field.getAnnotation(GenericType.class).value();
}
return super.getActualType(field);
}
} Isso vai funcionar de forma parecida com a estratégia do hibernate, você vai criar uma annotation -- que nesse caso eu chamei de @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface GenericType {
Class<?> value();
} E anotar seus atributos dessa forma: public class Pessoa {
@GenericType(Telefone.class)
private List telefones;
} Faz sentido? Fiz essa alteração no código de testes que você me enviou e funciona perfeitamente. Essa alteração pode entrar no próximo release, que não deve demorar pra sair (se tudo correr bem, semana que vem). Se quiser, até lá posso gerar um snapshot pra você ir usando/testando. É só me avisar |
Me parece perfeito Turini, se puder gerar um snap posso ir alterando meu
|
Perfeito! Acabei de deployar o 4.2.0-RC2-SNAPSHOT. Me avisa se deu certo? |
@Turini estou tentando fazer a classe especializada mas não é possível fazer o Override do método, não sei se estou esquecendo alguma coisa mas simplesmente não funciona. |
putz, acabei de ver que ele é estático (sabe se lá o pq). |
pronto, você atualiza e testa de novo? a versão é a mesma |
Vou testar Att.Jean C. Becker Em 2 de abril de 2015 01:19, Rodrigo Turini [email protected]
|
@jeancrbecker, me avisa quando testar, ta bem? |
@Turini funcionou perfeitamente! Obrigado pelo auxilio. |
excelente! logo teremos um novo release com essa alteração |
Ao retornar um json através do result, quando este objeto retornado contém uma lista e tento excluir ou incluir algum parametro da mesma ocorre o erro abaixo:
Um exemplo de objetos.
Então na controller quando tento retornar um json excluindo algum parametro da lista, ou tentando incluir apenas alguns parametros ocorre erro.
Isso não funciona
Isso também não
The text was updated successfully, but these errors were encountered: