Spring MVC 3.0:如何有效地验证对所有请求映射都是全局的路径变量?

lim*_*imc 7 java validation spring-mvc

我正试图用Spring MVC 3.0弄清楚,虽然我可以让它工作,但我似乎无法有效地处理这种特殊情况.

我有一个控制器,处理"/ {studyName} /模块"前缀,它看起来像这样: -

@Controller
@RequestMapping(value = "/{studyName}/module")
public class ModuleController {

    @RequestMapping(...)
    public ModelAndView getA(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getB(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getC(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getD(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是,我将studyName验证分散在所有方法中,也可能分散在其他控制器的方法中.有没有办法我可以在一个点上对studyName路径变量进行验证而不使用像AOP这样的东西?你如何处理这样的验证?

谢谢.

Gar*_*ryF 2

目前,要自动实现这一点有点棘手,但这是可能的。您应该使用实现附录 C 的 Bean 验证 (JSR-303) 提供程序。目前是 Apache BeanValidation 或 Hibernate Validator 4.2(处于测试阶段)。

将您选择的 bean 验证实现添加到类路径中。这将是 Spring MVC 使用的 JSR-303 的实现。

其次,使用 @Valid 和任何约束注释(例如 @NonNull)来注释方法参数。

这看起来像:

public ModelAndView getB(@Valid @NonNull @PathVariable String studyName, ...) {
Run Code Online (Sandbox Code Playgroud)

那应该有效。然后,您需要检查 Spring 错误是否有任何问题。

或者,如果您不使用任何其他 Spring 参数,您可以使用 InitBinder 注册验证器,如下所示:

@InitBinder
public void initBinder(WebDataBinder binder) {
  binder.setValidator(new StudyNameValidator());
}
Run Code Online (Sandbox Code Playgroud)