可以通过春季启动中的依赖注入来进行请求验证



==背景==
我已经习惯了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
    )

并将其中的大多数转发到验证功能。

==未来==
我想用一类替换大多数行,可以进行验证,然后将某些请求参数抽象为方法,因此,可以在多种方法上重复使用它们。

==问题==
如何编写可以注入控制器方法并运行验证的类,并具有可以解析请求参数的辅助方法?

== eNTERTATIV ==
我可以构建一个静态函数,可以获取注入的请求参数,http-servlets和cookie?

添加到@antoniosss的答案...

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

您的命令对象看起来像以下内容。

注意

i 强烈建议使用字符串作为所有传入的值,因为如果客户端提交的值不匹配预期类型(int,float,boolean等...(,则Spring Will Will提出一个例外,您几乎无法控制,并且例外可能是非常神秘的。

所有值都可以作为字符串进入的默认类型,因此建议将其用作最低的公共分母,然后检查以查看是否可以将输入的值施加到所需的类型上,在这种情况下为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...
}

是的,您只需在参数上使用@Valid注释来调用内置或自定义验证。检查官方文档

https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference-reference/html/validation.html

最新更新