Spring 如何指定@ModelAttribute端点允许使用哪些参数

Spring 如何指定@ModelAttribute端点允许使用哪些参数,spring,spring-mvc,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, @

我们有一个端点,如:

@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
}
调用/测试时?param1=ok输出为: 好啊 空的

调用/测试时?param1=ok¶m2=ok输出为: 好啊
ok
@ModelAttribute
@RequestParam
参数由spring MVC单独设置。因此
@RequestParam(value=“param1”,required=false)String param1
仅设置
字符串param1
,前提是请求中存在param1,但对
@modeltribute BigCriteria标准没有影响

如果要限制用于支持
标准的参数,应使用
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());
}

我在
modeldattribute
上使用了一个名称,表示上面初始化的
WebDataBinder
仅用于该
modeldattribute

尝试更改requestparam的名称这是一个很好的答案,您知道一种只允许字段指定为查询参数的方法吗?不确定是否理解您的最后一个问题。它们从何而来?是的,例如:使用setAllowedfields只能使用我在该控制器中作为@RequestParam注释的字段,以便自动执行该操作。@ramon_salla恐怕这不是Spring框架的逻辑。你最好像春天的小伙子们希望你做的那样使用它;-)