【问题标题】:spring request parameters binding errorspring请求参数绑定错误
【发布时间】:2015-08-04 07:06:33
【问题描述】:
@RequestMapping("/query")
@ResponseBody
public ResponseEntity<Content> getByQuery(HttpServletRequest request, ContentQuery query) {
    // Handle request.
}

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

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

有什么办法可以解决吗?

【问题讨论】:

  • 在这两种情况下,您在内容查询中究竟得到了什么
  • ContentQuery 对象使用所有字段作为默认值进行实例化。对象 == null,ints = 0,依此类推。如果我将此 ContentQuery 对象传递给我的服务,我将获得系统中所有内容对象的列表。
  • 如果有不适合 ContentQuery 对象的参数,或者客户端根本不提供任何参数,我想用 400-Bad Request 回答。
  • 您可以将验证放在模型或 bean "ContentQuery" 中。如果数据不符合验证。它会自动抛出 400 Bad Request
  • 我希望避免编辑 ContentQuery bean,但这可能是唯一的方法。这是一个相当大的CMS,我正在为它开发一个插件。所以我希望我不必接触核心模块(ContentQuery 是其中的一部分)

标签: javascript java spring


【解决方案1】:

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

感谢您的提示。之前没用过Validator接口,不过看起来是个干净的解决方案。

控制器:

@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.
}

验证器:

@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..
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多