spring mvc 参数封装

请看这个问题。也许我们会说:通过写vo来解决。确实,使用vo可以很好地解决spring mvc的参数封装的问题,而且,开发者写vo是一个好的习惯(我是一个懒人,如非必要很少写。。。)。

然而,我遇到另一个类似的问题。

请求方法如下:

@RequestMapping(value="/admin/website/delete/{id}",method=RequestMethod.POST)
public @ResponseBody void delete(@ModelAttribute("user")User user,@PathVariable("id")int id)

(方法里的内容没有贴出来)

它所在的Controller定义如下:

@Controller
@SessionAttributes("user")
public class WebSiteController

@ModelAttribute("user")User user与@SessionAttributes("user")对应,绑定了session中的"user"。

接下来,来看看User:

public class User {
	private int id;
       //其它属性、get/set方法及注解都省略了
}
 

于是,问题来了:session中user对象的id属性值被"/admin/website/delete/{id}"传进来的值覆盖了。

解决办法:

1.当然可以修改"/admin/website/delete/{id}",比如改为:"/admin/website/delete/{websiteId}",这样就不会覆盖user.id了,功能上完全没有问题。可是,这种需要确保各参数的属性名称不同的做法显然很不合理。如果这个user换作session里的其它对象,且属性较多,在执行类似的请求时,极有可能被某个同名参数将其属性覆盖。更糟糕的是,这种改变可能不会影响当前请求中程式的正确性,于是问题被隐藏了,但你不可能担保你在其它请求中使用这个session中的对象时不会有问题。

2.不使用@ModelAttribute("user")的方式来获得session中的user对象,使用HttpSession来取。当然,不好的地方就是使用了servlet的api。但相对于方法1,并且没有找到更好方法之前,更倾向于使用这一办法解决。

当前使用的spring版本是:3.1.0.RELEASE

仅作小记,希望对您有用,如果您有更好解决办法,很高兴您能将它分享出来。