Значения перекрытия @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.
Какие-либо предложения?