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?

questionAnswers(2)

yourAnswerToTheQuestion