如何指定允许@ModelAttribute端点的哪些参数

时间:2014-11-06 12:43:18

标签: spring spring-mvc

我们有一个端点,如:

@Secured(Roles.USER)
@ResponseStatus(value=HttpStatus.OK)
@RequestMapping(value="/test",  method=RequestMethod.GET , produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody void test(@ModelAttribute BigCriteria criteria,
         @RequestParam(value="param1",required=false) String param1){           

    logger.debug(criteria.getParam1()); 
    logger.debug(criteria.getParam2());
}

BigCriteria就像:

public class BigCriteria{
  private String param1;
  private String param2;
  private String param3;
  ...
  //plus getters and setters
}

调用/ test时?param1 = ok输出是: 好 空

调用/ test时?param1 = ok& param2 = ok输出是: 好 好的< ---我们不希望这个被填满!

所以,问题是:

我们怎样才能阻止@ModelAttribute仅使用指定为@RequestParams的params填充?

由于

1 个答案:

答案 0 :(得分:2)

@ModelAttribute@RequestParam参数由spring MVC单独设置。因此,如果请求中存在param1,@RequestParam(value="param1",required=false) String param1仅设置String param1,但对@ModelAttribute BigCriteria criteria没有影响。

如果要限制用于传播criteria的参数,则应使用InitBinder带注释的方法为已定义的ModelAttribute设置允许的字段

@InitBinder("bigCriteria")
public void initBinder(WebDataBinder binder) {
    binder.setAllowedFields("param1");
}
...
@RequestMapping(value="/test",  method=RequestMethod.GET , produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody void test(@ModelAttribute("bigCriteria") BigCriteria criteria,
         @RequestParam(value="param1",required=false) String param1){           

    logger.debug(criteria.getParam1()); 
    logger.debug(criteria.getParam2());
}

我在ModelAttribute上使用了一个名称,表示在其上方初始化的WebDataBinder仅用于ModelAttribute