Javascript spring请求参数绑定错误 @RequestMapping(“/query”) @应答器 公共响应属性getByQuery(HttpServletRequest请求,ContentQuery查询){ //处理请求。 }

Javascript spring请求参数绑定错误 @RequestMapping(“/query”) @应答器 公共响应属性getByQuery(HttpServletRequest请求,ContentQuery查询){ //处理请求。 },javascript,java,spring,Javascript,Java,Spring,这段代码将用作ContentQuery对象的http包装器,以便我可以使用javascript的http请求查询内容。Spring中的自动绑定将请求参数绑定到ContentQuery对象 问题是,如果有人在请求中放入未知的参数键,ContentQuery对象仍然是实例化的,我不知道如何检查是否得到意外的参数 有什么办法处理这个问题吗 然后编写自己的验证器并在控制器中运行它-docs.spring.io/spring/docs/current/spring framework reference/

这段代码将用作ContentQuery对象的http包装器,以便我可以使用javascript的http请求查询内容。Spring中的自动绑定将请求参数绑定到ContentQuery对象

问题是,如果有人在请求中放入未知的参数键,ContentQuery对象仍然是实例化的,我不知道如何检查是否得到意外的参数

有什么办法处理这个问题吗

然后编写自己的验证器并在控制器中运行它-docs.spring.io/spring/docs/current/spring framework reference/。然后你可以用你想要的任何状态返回ResponseEntity–freakman

谢谢你的提示。以前没有使用过验证器接口,但它看起来是一个干净的解决方案

控制器:

@RequestMapping("/query")
@ResponseBody
public ResponseEntity<Content> getByQuery(HttpServletRequest request, ContentQuery query) {
    // Handle request.
}
@Autowired
私有内容查询验证器;
@请求映射(“/query”)
@应答器
公共响应性getByQuery(
HttpServletRequest请求,ContentQuery查询,BindingResult){
validator.validate(查询、结果);
if(result.hasErrors()){
返回新的响应属性(HttpStatus.BAD_请求);
}
//无错误。使用查询对象从服务获取内容。
}
以及验证程序:

@Autowired
private ContentQueryValidator validator;

@RequestMapping("/query")
@ResponseBody
public ResponseEntity<List<Content>> getByQuery(
        HttpServletRequest request, ContentQuery query, BindingResult result) {
    validator.validate(query, result);
    if(result.hasErrors()){
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }

    // No errors. Fetch content from service using query object.
}
@组件
公共类ContentQueryValidator实现验证器{
@凌驾
公共布尔支持(类aClass){
返回ContentQuery.class.equals(aClass);
}
@凌驾
公共无效验证(对象对象,错误){
ContentQuery=(ContentQuery)obj;
List contentTemplate=query.getContentTemplate();
List displayTemplate=query.getDisplayTemplate();
if(contentTemplate==null&&displayTemplate==null){
错误。拒绝(“未提供查询”);
}
//这里有更多的验证。。
}
}

在这两个场景中,您在内容查询中究竟得到了什么内容ContentQuery对象被实例化,所有字段都是它们的默认值。对象==null,整数=0,依此类推。如果我将此ContentQuery对象传递给我的服务,我将获得系统中所有内容对象的列表。如果存在与ContentQuery对象不匹配的参数,以及客户端根本不提供任何参数,我希望使用400错误请求进行回答。您可以在模型或bean“ContentQuery”中进行验证。如果数据不符合验证的要求。它将自动抛出400个错误请求。我希望避免编辑ContentQuerybean,但这可能是唯一的方法。这是一个相当大的CMS,我正在为它开发一个插件。所以我希望我不必触及核心模块(ContentQuery是其中的一部分)
@Component
public class ContentQueryValidator implements Validator{
    @Override
    public boolean supports(Class<?> aClass) {
        return ContentQuery.class.equals(aClass);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ContentQuery query = (ContentQuery) obj;

        List<Integer> contentTemplate = query.getContentTemplate();
        List<Integer> displayTemplate = query.getDisplayTemplate();

        if(contentTemplate == null && displayTemplate == null){
            errors.reject("No query provided");
        }
        // More validation here..
    }
}