3

关于stackoverflow的第一篇文章......我开始使用SpringMVC,我试图找出将我的实体链接到尽可能无状态的Web视图的最佳方法。

我发现的一种方法是在一个方法上使用@ModelAttribute,该方法在参数中(从请求中)接收实体 ID,该实体 ID 从服务/持久层中找到它,并将其返回,以便将其插入到当前请求。

此外,Spring MVC 绑定任何与我的实体字段匹配的传入参数并自动更新其值(通过 WebDataBinder)。

我的问题是关于最后一种行为。我发现当客户发布一些数据时更新我的​​实体很有用。但我想在一个简单的 GET 请求(我认为它是只读的)上避免它。当前行为将允许通过在此类请求的查询中添加参数来更新实体,这可能是一个安全问题。

我知道 dataBinder.setAllowedFields() 和其他东西,但我更喜欢一种方法来禁用任何类型的字段映射任何 GET 请求。有什么办法吗?

谢谢!

编辑:我添加了一个示例原型,以使其更清楚我在寻找什么......

@ModelAttribute Entity retrieveEntity(@RequestParam(required=true) Long id) {
    // This is called before the request handler and before parameters are mapped to the entity
    return entityRepository.get(id);
}

@RequestMapping(value="/modify", method=RequestMethod.POST) 
public ModelAndView handleModifyRequest(@ModelAttribute Entity entity) {
    // Here, I want my entity to reflect the parameters passed in the posted form (this works)
    ....
}

@RequestMapping(value="/read", method=RequestMethod.GET) 
public ModelAndView handleReadRequest(@ModelAttribute Entity entity) {
    // Here, I DON'T want my entity to reflect the parameters passed in the URL (which is what happens...)
    ....
}
4

1 回答 1

2

最后,我决定采用这样的方法,因为似乎只有在请求处理程序方法采用 ModelAttribute 参数时才会发生参数映射

@ModelAttribute Entity retrieveEntity(@RequestParam(required=true) Long id) {
    return entityRepository.get(id);
}

@RequestMapping(value="/modify", method=RequestMethod.POST) 
public ModelAndView handleModifyRequest(@ModelAttribute Entity entity) {
    // Here, the request parameters have been mapped to the entity
    ....
}

@RequestMapping(value="/read", method=RequestMethod.GET) 
public ModelAndView handleReadRequest(ModelMap model) {
    // This will avoid any parameter mapping to the entity
    Entity entity = (Entity)model.get("entity");
    ....
}

欢迎任何更好的解决方案!谢谢

于 2012-10-23T00:38:12.637 回答