我有一个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) {
...
}
问题是User.id
正在设置@PathVariable("id")
。我相信我遇到了这个@RequestParam
也。我假设这是因为两者具有相同的名称和类型。看完之后Spring 的文档(见下文)我假设这是预期的行为:
下一步是数据绑定。 WebDataBinder 类匹配请求参数名称(包括查询字符串参数和表单字段)以按名称对属性字段进行建模。在必要时应用类型转换(从字符串到目标字段类型)后,将填充匹配字段。
但是,我认为这种情况相当普遍,其他人如何处理这种情况?如果我的发现是正确的并且这是预期的行为(或错误),那么这似乎很容易出错。
可能的解决方案:
- Change
@PathVariable("id")
to @PathVariable("somethingElse")
。有效,但使用 @RequestParam 并不那么简单(例如,我不知道如何将 jqgrid 的请求参数 id 更改为其他内容,但这是另一个问题)。
- Change
@PathVariable("id")
类型从 Long 到 Int。这将使User.id
and id
类型不同,但转换为 Long 看起来很丑:)
- 不要使用
@ModelAttribute
在这里并查询数据库User
再次。与其他方法不一致并且涉及冗余的数据库调用。
有什么建议么?