我知道春天有验证器。但是,这些验证器只能绑定到单个对象。在请求体中说一个Pojo。然而,我有一个场景,我有一个get请求,我想验证一个日期范围:我有一个开始日期和结束日期作为@requestparams
。我应该如何验证这些?
也有一个验证器应用于相同的@restcontroller
:对于post请求,说Employeevalidtor
。我可以为同一个@restcontroller
中的不同对象调用多个验证器吗?
您可以使用单独的验证器,但它们必须通过传递相应的要验证的对象来手动实例化。
我假设您正在谈论请求绑定验证。本文
中提到的使用Spring validator对@RequestParam和@PathVariables也可以获得相同的验证。在这里添加相关的部分。控制器看起来像这样:
@RestController
@Validated
public class RegistrationController {
@RequestMapping(method = RequestMethod.GET,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE
)
@ResponseStatus(HttpStatus.OK)
public Map search(@Email @RequestParam("email") String email) {
return emailMessage(email);
}
}
注意类级别的@Validated方法(也可以在方法级别声明)。
让Spring MVC将您的请求参数映射到封装所有相关输入的pojo,然后为其添加验证器。
@RestController
@RequestMapping("/myUrl")
public class MytController {
private final MyIntervalValidator validator;
@InitBinder
public void initBinder(WebDataBinder binder){
binder.setValidator(validator);
}
@GetMapping
public void doSomthing(@Valid @RequestParam MyInterval interval){...}
class MyInterval implements Serializable{
private Date startDate;
private Date endDate;
}
import org.springframework.validation.Validator;
class MyIntervalValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return MyInterval.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
final MyInterval params = (MyInterval) target;
....
}
}