2017-09-24 94 views
1

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

这是我的控制器类和方法

@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 

    } 

} 

击中端点时语句执行既不打印。

任何帮助,我可能会失踪或做不同的事情将不胜感激,谢谢!

回答

0

如果您想获得单个RequestParams,如status,可以按照以下代码强制执行。

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

} 

希望这项工作!

+0

嗨Oyewole。我在帖子中看到我不清楚,我的意思是验证路径变量而不是请求参数。我已经更新了该帖子以更加一致。我的问题不在于获取变量,而是在变量上运行验证程序 – BlakeM

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

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

更多详细信息,请参阅上述示例here