@PathVariable和@ModelAttribute的值重叠
我User
在与的会话中存储了一个对象@SessionAttributes
。还有一个简单的装饰方法,@ModelAttribute
用于在会话的值为null时对其进行初始化。
用户类别:
@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) {
...
}
。我相信我也遇到了这个问题@RequestParam
。我假设这是因为它们具有相同的名称和类型。阅读完Spring的文档(请参阅下文)之后,我假设这是预期的行为:
下一步是数据绑定。WebDataBinder类将请求参数名称(包括查询字符串参数和表单字段)匹配,以按名称对属性字段进行建模。在必要时应用类型转换(从String到目标字段类型)后,将填充匹配字段。
但是,我认为这种情况相当普遍,其他人如何处理呢?如果我的发现是正确的,并且这是预期的行为(或错误),则似乎很容易出错。
- 更改
@PathVariable("id")
为@PathVariable("somethingElse")
。可以,但是使用@RequestParam并不是那么简单(例如,我不知道如何将jqgrid的请求参数ID更改为其他名称,但这是另一个问题)。 - 将
@PathVariable("id")
类型从Long 更改为Int。这将使User.id
和id
类型不同,但投龙长得难看:) - 不要
@ModelAttribute
在这里使用并User
再次查询数据库。与其他方法不一致,并且涉及冗余的数据库调用。
有什么建议么?
回答:
这种方法怎么样-
@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String showItem(@PathVariable("id") Long id,
Model uiModel) {
User user = (User)uiModel.asMap().get("user");
...
}
以上是 @PathVariable和@ModelAttribute的值重叠 的全部内容, 来源链接: utcz.com/qa/414881.html