【发布时间】:2019-08-12 20:08:25
【问题描述】:
当我在 Rest 控制器的类级别启用 @Validated spring 注释时,会生成 2 个验证上下文(每个都有不同的前缀)。 @Validated 注释是必需的,因为我想使用 2 个不同的验证组,但由于有 2 个验证上下文,所有验证都会执行两次。我认为所有验证都应该只验证一次:
- 我的配置有问题吗?
- 我错过了什么吗?
@RestController
@RequestMapping
@Validated
public class KidController {
private final KidService kidService;
public KidController(KidService kidService) {
this.kidService = kidService;
}
@PostMapping
@Validated(OnRegistrationRequest.class)
@ResponseStatus(HttpStatus.CREATED)
public KidDTO createKidRegistration(@RequestBody @Valid KidDTO kid) {
return kidService.saveKid(kid);
}
}
public interface KidValidatorGroup {
interface OnRegistrationRequest extends Default {
}
interface OnCheckInPersist extends Default {
}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonPropertyOrder({"id"})
@JsonInclude(Include.NON_NULL)
public class KidDTO {
@NotEmpty
private String id;
@NotEmpty
private String firstName;
@KidAgeConstraint
private Integer age;
@NotEmpty(groups = OnCheckInPersist.class)
private String roomDocId;
@Valid
private Set<AnswerDTO> answers;
@Valid
private Set<GuardianDTO> guardians;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldStrictDependentConstraint(principalField = "answer",
dependentField = "description")
@JsonInclude(Include.NON_NULL)
public class AnswerDTO {
@QuestionIdConstraint(groups = OnRegistrationRequest.class)
private String questionId;
}
我在调试应用程序时发现了 2 个上下文,而第二个上下文看起来像前缀这样的方法名称。
【问题讨论】:
-
@Validated 注释只能在类级别。为什么放在 createKidRegistration 方法中?
-
@SergZenyuk 因为我需要指定要使用的组。
标签: java spring spring-boot bean-validation spring-restcontroller