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