Значения перекрытия @PathVariable и @ModelAttribute

у меня естьUser объект хранится в сеансе с@SessionAttributes, И простой метод украшен@ModelAttribute чтобы инициализировать его, когда значение сеанса равно нулю.

Класс пользователя:

@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;
    }
    ...

контроллер:

@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {

Метод @ModelAttribute:

@ModelAttribute("user")
    public User createUser(Principal principal) {
        return userService.findByUsername(principal.getName());
    }

Кажется, что все работает как ожидалось, за исключением этого конкретного метода:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
            Model uiModel) {
   ...    
}

The problem is that User.id is being set with @PathVariable("id"), Я считаю, что столкнулся с этим@RequestParam тоже. Я предполагаю, что это потому, что оба имеют одно и то же имя и тип. После прочтенияВесенняя документация (см. ниже) Я предполагаю, что это ожидаемое поведение:

The next step is data binding. The WebDataBinder class matches request parameter names — including query string parameters and form fields — to model attribute fields by name. Matching fields are populated after type conversion (from String to the target field type) has been applied where necessary.

Тем не менее, я думаю, что этот сценарий довольно распространен, как другие люди справляются с этим? Если мои выводы верны и это ожидаемое поведение (или ошибка), это может привести к ошибкам.

Possible solutions:

Change @PathVariable("id") to @PathVariable("somethingElse"). Works but it's not as straightforward with @RequestParam (e.g. I don't know how to change jqgrid's request parameter id to something else but this is another issue). Change @PathVariable("id") type from Long to Int. This will make User.id and id types differ but the cast to Long looks ugly :) Don't use @ModelAttribute here and query the DB for User again. Not consistent with other methods and involves redundant DB calls.

Какие-либо предложения?

Ответы на вопрос(2)

Ваш ответ на вопрос