VRaptor 3.1.3 - 'Cascading' de Prioridade de Paths

3 respostas
lscosta

Talvez isso já esteja corrigido nas versões mais recentes, mas precisaremos de uma forte refatoração das validações para poder atualizar o framework pois temos muita coisa baseada no extinto Hibernate.validate().

Tenho um controller capaz de servir todas entidades do sistema em json e xml, que se parece com isso:

@Resource
@ApiController
public class ApiBaseController {

	@Get
	@Path("/api/{token}/{entity}.json")
	public void listJson(final String entity) {
		result.use(Results.json()).from(search(entity)).serialize();
	}

}

Porém, algumas entidades vão precisar de tratamento especial, principalmente em função da referência cíclica, quando precisar de serialização recursiva. Isso vai trazer conflito nos Paths, mas blz, posso informar a prioridade nos métodos.

@Resource
@ApiController
public class ApiScheduleController {

	@Get
	@Path(value="/api/{token}/schedule.json", priority=1)
	public void listJson() {
		result.use(Results.json()).from(scheduleService.findAll()).serialize();
	}

}

Essa coisa vai começar a ficar meio repetitiva… Quero manter a clareza do código e, principalmente, evitar que um desenvolvedor esqueça desses detalhes no decorrer do projeto.
O bacana é que o VRaptor permite que eu mova a parte comum dos Paths como anotação do controller.

@Resource
@ApiController
@Path(value="/api/{token}", priority=1)
public class ApiScheduleController {

	@Get
	@Path("/schedule.json")
	public void listJson() {
		result.use(Results.json()).from(scheduleService.findAll()).serialize();
	}

}

O problema é que nesse momento o VRaptor volta a dar conflito de Paths, ou seja, ele não faz o ‘cascading’ da prioridade dos paths como faz com o prefixo dos mesmos.

Não testei se isso ocorre nas versões mais recentes, que trabalham com constantes como Path.HIGH.

Isso é um bug ou é assim mesmo? Se for bug, rola uma correção para essa versão (3.1.3) ?

3 Respostas

G

Essa alteração deveria ser bem simples. Bastava alterar para validator.validate() e injetar validator no construtor. Você teve algum problema com isso?

O problema de usar o priority tão genérico assim é que você pode ter conflitos caso você definir o mesmo priority para duas classes que possuirem um mesmo método. Há uma discução sobre isso aqui pelo GUJ onde o Lucas argumenta os motivos de deixar o priority implementado apenas nos métodos.

Lucas_Cavalcanti

na versão mais nova, vc pode deixar só o Path mais genérico como priority=Path.LOWEST, daí vc não precisa mexer nos outros…

como o garcia falou, priority não funciona na anotação da classe, pq deixa meio complicada e ambígua a lógica da criação das rotas

lscosta

Humn, saquei. Blz, eu deixo assim até atualizarmos para a última versão.

Garcia, o esquema de validação aqui tá meio feinho e espalhado. Vamos refatorar em seguida, pra ficar ‘nos trinques’.

Valeus!

Criado 28 de abril de 2011
Ultima resposta 29 de abr. de 2011
Respostas 3
Participantes 3