我们有一个端点,如:
@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填充?
由于
答案 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
。