@RequestMapping("/query")
@ResponseBody
public ResponseEntity<Content> getByQuery(HttpServletRequest request, ContentQuery query) {
// Handle request.
}
此代码将作为ContentQuery对象的http包装器运行,以便我可以使用来自javascript的http请求查询内容。 Spring中的自动绑定将请求参数绑定到ContentQuery对象。
问题是如果有人在请求中放入了一个未知的参数键,那么ContentQuery对象就会被实例化,我不知道如何检查我是否得到了意外的参数。
有没有办法解决这个问题?
答案 0 :(得分:1)
然后编写自己的验证器并在控制器中运行它 - docs.spring.io/spring/docs/current/spring-framework-reference / ...然后你可以使用你想要的任何状态返回ResponseEntity - freakman
谢谢你的提示。 Haven之前没有使用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..
}
}