==背景==
我习惯了Laravel中提供的依赖项注入,您可以在其中创建一个扩展请求类的类,并将所有验证放入其中,然后在多个控制器方法中重新使用它。
==当前代码===
我目前正在尝试用Java Spring Boot做一个项目,而我的控制器方法现在看起来像这样:
@RequestMapping("/list")
@ResponseBody
public DTResponse<Name> list(
@RequestParam(defaultValue = "0") int draw,
@RequestParam(defaultValue = "0") int start,
@RequestParam(defaultValue = "0") int length,
@RequestParam(name="search[value]", defaultValue = "") String search,
@RequestParam(name="columns[0][search][value]", defaultValue = "") String firstname,
@RequestParam(name="columns[1][search][value]", defaultValue = "") String lastname,
@RequestParam(name="order[0][column]", defaultValue = "0") int sortColumn,
@RequestParam(name="order[0][dir]", defaultValue = "asc") String sortOrder,
@CookieValue String language,
HttpServletResponse response,
HttpServletRequest request
)
并将其中大多数转发到验证功能。
==未来==
我想用一个类替换大部分行,该类可以进行验证,并将一些请求参数抽象到方法中,
因此它们很容易在多种方法上重复使用。
==问题==
我该如何编写一个类,该类可以注入控制器方法中并运行验证,并具有可以解析请求参数的辅助方法?
== Alternativ ==
我可以构建一个静态函数来获取注入的请求参数,http-servlet和cookie吗?
答案 0 :(得分:1)
要添加到@Antoniossss的答案...
使用@Valid
注释是这里的方法。
这是一个小例子。
@ModelAttribute("command")
public DTRequest setupCommand() {
return new DTRequest;
}
@RequestMapping(value = "/list")
@ResponseBody
public DTResponse<Name> list(@ModelAttribute("command") @Valid DTRequest request, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
DTResponse<Name> response;
if (bindingResult.hasErrors()) {
// Do something here to let the client know that something went wrong.
// You can throw and exception and catch it one way or another...
} else {
// Do your real work here...
}
return response;
}
您的命令对象可能如下所示。
注意
我强烈建议对您所有传入的值使用字符串,因为如果客户端提交的值与预期的类型(int,float,boolean等)不匹配,spring将抛出一个您无法控制的异常,并且该异常可能是非常隐秘的。
所有值都可以输入的默认类型为String,因此建议将其用作最低公分母,然后检查输入的值是否可以转换为所需的类型(在这种情况下为int / integer)。
public class DTRequest {
@Digits
private String draw = "0";
@Digits
private String start = "0";
@Digits
private String length = "0";
// etc... per field.
// Setters and getters...
public void setDraw(String draw) {
this.draw = draw;
}
public String getDraw() {
return this.draw;
}
public int getDrawAsInt() {
return Integer.valueOf(this.draw);
}
// etc... per setters and getters...
}
答案 1 :(得分:0)
是的,您只需在参数上使用@Valid
批注即可调用内置或自定义验证。
查看官方文档
https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html