Uli*_*ses 10 spring spring-mvc
我有一个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;
}
...
Run Code Online (Sandbox Code Playgroud)
控制器:
@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {
Run Code Online (Sandbox Code Playgroud)
@ModelAttribute方法:
@ModelAttribute("user")
public User createUser(Principal principal) {
return userService.findByUsername(principal.getName());
}
Run Code Online (Sandbox Code Playgroud)
除了这个特殊的方法外,它似乎都按预期工作:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
Model uiModel) {
...
}
Run Code Online (Sandbox Code Playgroud)
问题是User.id正在设置@PathVariable("id").我相信我也遇到了这个问题@RequestParam.我假设那是因为两者都有相同的名称和类型.在阅读了Spring的文档(见下文)后,我假设这是预期的行为:
下一步是数据绑定.WebDataBinder类将请求参数名称(包括查询字符串参数和表单字段)与名称模型属性字段进行匹配.在必要时应用类型转换(从String到目标字段类型)后填充匹配字段.
但是,我认为这种情况相当普遍,其他人如何处理呢?如果我的发现是正确的,这是预期的行为(或错误),这似乎非常容易出错.
可能的解决方案:
@PathVariable("id")到@PathVariable("somethingElse").可行,但使用@RequestParam并不是那么简单(例如,我不知道如何将jqgrid的请求参数id更改为其他内容,但这是另一个问题). @PathVariable("id")类型从Long 更改为Int.这将使得User.id和id类型不同,但铸造到龙看起来很丑:)@ModelAttribute在这里使用并User再次查询数据库.与其他方法不一致并涉及冗余的DB调用.有什么建议?
这种方法怎么样 -
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id,
Model uiModel) {
User user = (User)uiModel.asMap().get("user");
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10810 次 |
| 最近记录: |