【问题标题】:Using Spring @Validated Annotation to Validate a Get Request Path Variable使用 Spring @Validated 注解验证获取请求路径变量
【发布时间】:2017-09-24 21:06:36
【问题描述】:

我正在尝试使用 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;
    }

}

还有验证器类

@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

    }

}

到达端点时不会执行任何打印语句。

任何关于我可能遗漏或做不同事情的帮助将不胜感激,谢谢!

【问题讨论】:

    标签: java spring validation spring-boot


    【解决方案1】:

    您可以实现所需的验证功能,如下所示。

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

    -

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

    -

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

    最后别忘了用@Validated注解Controller。

    @RestController
    @Validated
    public class ProfileController {
        //...
    }
    

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

    【讨论】:

    • 这个建议从 spring 的 1.5.0 版本开始对我有用
    【解决方案2】:

    如果你想获得像status 这样的单个RequestParams,你可以按照下面的代码强制它。

    @RestController
    public class ProfileController {
    
        @RequestMapping(value = "/profile/{param}", method = RequestMethod.GET)
        public IVRProfile getProfile(@RequestParam(name = "status", required = true) String status, @ModelAttribute("param") String param) {}
    
    }
    

    如果您想强制使用 PathVariable,请执行此操作。

    @RestController
    public class ProfileController {
    
        @RequestMapping(value = "/profile/{param}", method = RequestMethod.GET)
        public IVRProfile getProfile(@PathVariable(name = "param", required = true) String param, @ModelAttribute("param") String param) {}
    
    }
    

    希望这项工作!!!

    【讨论】:

    • 嗨,Oyewole。我看到我在帖子中并不清楚,我的意思是验证路径变量而不是请求参数。我已经更新了帖子以更加一致。我的问题不在于获取变量,而是在变量上运行验证器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多