假设我有一个对象,它有两个需要验证的字段:
public class AnyRQ {
@MerchantAccountValidation
@JsonProperty(value = "merchant-account")
private MerchantAccount merchantAccount;
@RequestIdValidation
@JsonProperty(value = "request-id")
private String requestId;
}注释@MerchantAccountValidation和@RequestIdValidation都实现了一个ConstraintValidator,并包含有效或无效的规则。(只显示一个类)
public class RequestIdValidator
implements ConstraintValidator<RequestIdValidation, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.length() > 10;
}
}现在我有了一个有两个端点的控制器。终结点1应该验证这两个字段,但是请求2应该只验证requestId。
@RestController
@RequestMapping("/validate")
public class ValidController {
@PostMapping("/endpoint1")
public ResponseEntity<?> register(@Valid @RequestBody AnyRQ req, Errors errors) {
if (errors.hasErrors()) {
}
return null;
}
@PostMapping("/endpoint2")
public ResponseEntity<?> authorization(@Valid @RequestBody AnyRQ req, Errors errors) {
if (errors.hasErrors()) {
}
return null;
}
}有没有办法获得某种优先级或继承来使其正常工作?我正在考虑在端点的方法级别上使用验证注释。但不幸的是,这并不起作用。
发布于 2020-08-03 22:08:43
帕特里克!
要获得期望的结果,您可以使用@GroupSequence。它主要用于排序验证(如果id为空F.E.,则无需检查实体是否存在于数据库中),但也适用于您的任务。假设您有2个验证组(需要更好的名称: ):
public interface InitialValidation {
}
@GroupSequence(InitialValidation.class)
public interface InitialValidationGroup {
}
public interface FullValidation {
}
@GroupSequence(FullValidation.class)
public interface FullValidationGroup {
}在DTO中指定它们:
public class AnyRQ {
@MerchantAccountValidation(groups = FullValidation.class)
@JsonProperty(value = "merchant-account")
private MerchantAccount merchantAccount;
@RequestIdValidation(groups = {InitialValidation.class, FullValidation.class})
@JsonProperty(value = "request-id")
private String requestId;
}在控制器中,使用@Validated代替@Valid来提供相应的组:
@RestController@RequestMapping("/validate")公共类ValidController {
@PostMapping("/endpoint1")
public ResponseEntity<?> register(@Validated(FullValidationGroup.class) @RequestBody AnyRQ req, Errors errors) {
if (errors.hasErrors()) {
}
return null;
}
@PostMapping("/endpoint2")
public ResponseEntity<?> authorization(@Validated(InitialValidationGroup.class) @RequestBody AnyRQ req, Errors errors) {
if (errors.hasErrors()) {
}
return null;
}
}另一种选择是在DTO中保留一个组,但在控制器中为@Validated指定两个组。
https://stackoverflow.com/questions/63229205
复制相似问题