Skip to content
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

Controller generico #930

Closed
jeancrbecker opened this issue Jan 28, 2015 · 13 comments · Fixed by #932
Closed

Controller generico #930

jeancrbecker opened this issue Jan 28, 2015 · 13 comments · Fixed by #932

Comments

@jeancrbecker
Copy link

Galera alguem conseguiu criar um controller generico usando VRaptor 4.1 ? Quando utilizo metodos que recebem objetos como parametro ele não faz o reflection corretamente e acaba me retornando uma instancia de gson, agora quando incluo o tipo especifico da classe funciona sem problemas, ele apenas não reconhece quando é um tipo generico, precisaria fazer um interceptor ou um observer mas não tenho ideia de como implementar.

Minha controller generica:

public abstract class GenericController<T> {

    protected GenericService genericService;
    protected Result result;
    private Class<T> entityClass;

    public GenericController() {
    }

    @Inject
    public GenericController(Class<T> entityClass, Result result, GenericService genericService) {
        this.result = result;
        this.genericService = genericService;
        this.entityClass = entityClass;
    }

    @Permission(permissoes = {"usuario.logado"})
    @Get("")
    public void listar() {
        result.use(json()).withoutRoot().from(genericService.list()).serialize();
    }

    @Permission(permissoes = {"usuario.logado"})
    @Get("{id}")
    public void getByID(Long id) {
        result.use(json()).withoutRoot().from(genericService.find(id)).serialize();
    }
/**ESSE METODO NÃO FUNCIONA**/
    @Permission(permissoes = {"usuario.logado"})
    @Post("")
    @Consumes(value = "application/json", options = WithoutRoot.class)
    public void novo(T entity) {
        genericService.insert(entity);
        result.use(json()).withoutRoot().from("ok").serialize();
    }
/**ESSE METODO FUNCIONA**/
    @Permission(permissoes = {"usuario.logado"})
    @Put("")
    @Consumes(value = "application/json", options = WithoutRoot.class)
    public void salvar(Menu entity) {
        genericService.update(entity);
        result.use(json()).withoutRoot().from("ok").serialize();
    }
}

Minha controller especializada

@Controller
@Path("/menus")
public class MenuController extends GenericController<Menu> {

    private MenuService menuService;

    @Inject
    public MenuController(Result result, MenuService menuService) {
        super(Menu.class, result, menuService);
    }

    @Deprecated
    public MenuController() {

    }

}

@lucascs
Copy link
Member

lucascs commented Jan 28, 2015

O problema está nesse método:

https://github.com/caelum/vraptor4/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/serialization/gson/GsonDeserialization.java#L179-L187

A gente precisa adicionar um teste que reproduz essa sua situação e ver se esse método retorna a classe correta. Quer tentar fazer isso?

@jeancrbecker
Copy link
Author

Posso tentar sim, o que preciso fazer ?

@lucascs
Copy link
Member

lucascs commented Jan 28, 2015

Entra nessa classe: https://github.com/caelum/vraptor4/blob/master/vraptor-core/src/test/java/br/com/caelum/vraptor/serialization/gson/GsonDeserializerTest.java

copia os seus dois controllers pra um dos pacotes de teste, passa pro teste o método problemático, e vê se o deserializer usa o tipo certo.

@jeancrbecker
Copy link
Author

Não entendi muito bem como fazer isso que você pediu, comecei a usar o git agora. Pelo classe que você tinha passado coloquei um observer "@observes ControllerFound" e percebi que o parameterTypes do method quando utiliza parametro genérico no controller vem java.lang.Object e não o tipo setado ao instanciar a classe.

@lucascs
Copy link
Member

lucascs commented Jan 28, 2015

ele vai vir como object mesmo, pq ele é o T.

nesse caso, a gente tem que ver que o generic type do cara é do tipo TypeVariable, e pegar o tipo do T da classe do controller, não do método. Tem idéia do que eu to falando?

Generics é bem zoado de fazer esse tipo de código, tem vários casos chatos o.o

@jeancrbecker
Copy link
Author

Sim isso eu imaginei, por isso que eu disse que talvez tenha de usar um interceptor ou mesmo um observer, assim como vi que esse cara fez http://www.guj.com.br/java/221981-vraptor-3--genericcontroller-resolvido mas pelo jeito não funciona mais assim no VRaptor 4.

@lucascs
Copy link
Member

lucascs commented Jan 28, 2015

Não precisa chegar a tanto, só mudar aquele método que eu tinha linkado lá em cima já era o suficiente.

Precisa corrigir ele pra retornar o tipo certo no seu caso. Por isso eu falei pra vc escrever um teste e mandar um Pull request pra corrigir isso no VRaptor =)

@jeancrbecker
Copy link
Author

Se puder me dizer um link onde ensina e fazer isso, pois como eu disse comecei a usar hoje o github apenas para tentar descobrir a solução para meu problema, desde já agradeço.

@clairton
Copy link
Contributor

Boa Noite.
Fiz um crud generico, está em
https://github.com/clairton/vraptor-crud/blob/master/src/main/java/br/eti/clairton/vraptor/crud/CrudController.java
e os testes em
https://github.com/clairton/vraptor-crud/blob/master/src/test/java/br/eti/clairton/vraptor/crud/CrudControllerTest.java
Espero que possa ajudar.

Atenciosamente
Clairton Rodrigo Heinzen
Bacharel em Sistemas de Informação
Especialista em Engenharia de Software
Desenvolvedor Java - Sicoob MaxiCrédito
https://github.com/clairton https://github.com/clairton

https://www.facebook.com/clairton.rodrigo
https://www.facebook.com/clairton.rodrigo

Em 28 de janeiro de 2015 19:26, jeancrbecker notifications@github.com
escreveu:

Se puder me dizer um link onde ensina e fazer isso, pois como eu disse
comecei a usar hoje o github apenas para tentar descobrir a solução para
meu problema, desde já agradeço.


Reply to this email directly or view it on GitHub
#930 (comment).

@lucascs
Copy link
Member

lucascs commented Jan 29, 2015

Consegui escrever o teste que reproduz o bug. Vou ver se consigo corrigir agora =)

@lucascs
Copy link
Member

lucascs commented Jan 29, 2015

Criei lá o Pull Request, quer que gere uma versão snapshot pra vc assim que for aceito?

o que dá pra fazer tb é vc copiar essa classe que mudou pro seu projeto, daí vai sobrescrever o componente padrão do VRaptor

@jeancrbecker
Copy link
Author

Legal Lucas, show de bola, copiei a classe para meu projeto e tudo funcionou perfeito, quando sair um novo snapshot me avisa que ja vou atualizar pra ficar com o projeto atualizado. Muito obrigado pela ajuda.

@lucascs
Copy link
Member

lucascs commented Jan 29, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants