Valores de @PathVariable e @ModelAttribute sobrepostos
eu tenho umUser
objeto armazenado na sessão com@SessionAttributes
. E um método simples, decorado com@ModelAttribute
para inicializá-lo sempre que o valor da sessão for nulo.
Classe de usuário:
@Entity
@Table( name="USER")
public class User implements java.io.Serializable {
private Long id;
private String username;
private String password;
....
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name ="ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
...
Controlador:
@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {
Método @ModelAttribute:
@ModelAttribute("user")
public User createUser(Principal principal) {
return userService.findByUsername(principal.getName());
}
Tudo parece funcionar como esperado, exceto neste método específico:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
Model uiModel) {
...
}
O problema é queUser.id
está sendo definido com@PathVariable("id")
. Eu acredito que eu corri para isso com@RequestParam
também. Estou assumindo que é porque ambos têm o mesmo nome e tipo. Depois de lerDocumentação do Spring (veja abaixo) Estou assumindo que este é o comportamento esperado:
O próximo passo é a ligação de dados. A classe WebDataBinder corresponde aos nomes dos parâmetros de solicitação - incluindo parâmetros de string de consulta e campos de formulário - para modelar campos de atributos por nome. Os campos correspondentes são preenchidos após a conversão de tipo (de String para o tipo de campo de destino) ter sido aplicada quando necessário.
No entanto, eu acho que esse cenário é bastante comum, como outras pessoas lidam com isso? Se minhas descobertas estiverem corretas e isso for um comportamento esperado (ou bug), isso parece ser muito propenso a erros.
Soluções possíveis:
mudança@PathVariable("id")
para@PathVariable("somethingElse")
. Funciona, mas não é tão simples com @RequestParam (por exemplo, não sei como alterar o id do parâmetro de solicitação do jqgrid para outra coisa, mas esse é outro problema).mudança@PathVariable("id")
digite de Long para Int. Isso fará com queUser.id
eid
tipos diferem, mas o elenco de Long parece feio :)Não use@ModelAttribute
aqui e consultar o DB paraUser
novamente. Não consistente com outros métodos e envolve chamadas DB redundantes.Alguma sugestão?