使用 Spring @Validated 注解验证获取请求路径变量

Bla*_*keM 2 java validation spring spring-boot

我尝试使用 Spring Validator 和 @Validated 注释来验证 Get Request 参数,但无法运行验证器。我正在使用 ModelAttribute 尝试让验证器在路径变量而不是请求正文上运行。是否可以在获取请求路径变量上运行验证器?

这是我的控制器类和方法

@RestController
public class ProfileController {

    @RequestMapping(value = "/profile/{param}", method = RequestMethod.GET)
    public IVRProfile getProfile(@Validated(ParamValidator.class) @ModelAttribute("param") String param) {

    return sampleProfile();
    }

    @ModelAttribute("param")
    public String paramAsModelAttribute(@PathVariable String param) {
        return param;
    }

}
Run Code Online (Sandbox Code Playgroud)

和验证器类

@Component
public class ParamValidator implements Validator
{

    @Override
    public boolean supports(Class<?> clazz)
    {
        System.out.println("Validator supports test");
        return String.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors)
    {
        System.out.println("Validator Test");
        // Validation code

    }

}
Run Code Online (Sandbox Code Playgroud)

当到达端点时,两个打印语句都不会被执行。

对于我可能缺少的内容或采取不同的做法的任何帮助将不胜感激,谢谢!

lza*_*tos 6

您可以按如下方式实现所需的验证功能。

public class ParamValidator implements ConstraintValidator<ParamConstraint, String> {

    @Override
    public void initialize(ParamConstraint paramConstraint) {
    }

    @Override
    public boolean isValid(String paramField, ConstraintValidatorContext cxt) {
        //Perform paramField validation
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

-

@Documented
@Constraint(validatedBy = ParamValidator.class)
@Target( { ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamConstraint {

    String message() default "Default validation message";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

-

@RequestMapping(value = "/profile/{param}", method = RequestMethod.GET)
public IVRProfile getProfile(@Valid @ParamConstraint @ModelAttribute("param") String param) {
    return sampleProfile();
}
Run Code Online (Sandbox Code Playgroud)

最后不要忘记用 注释 Controller @Validated

@RestController
@Validated
public class ProfileController {
    //...
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处提到的示例中找到更多详细信息。