2017-09-24 89 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