gpt4 book ai didi

java - 使用组时 Spring Boot 2 剩余 validator 调用两次

转载 作者:行者123 更新时间:2023-12-02 09:36:33 27 4
gpt4 key购买 nike

当我在 Rest Controller 中的类级别启用 @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 个上下文,第二个上下文看起来带有方法名称(如前缀)。

Context Image 1 Context Image 2

最佳答案

在您的代码中,您有一个注释会触发对方法参数和方法返回值的验证:

    @PostMapping
@Validated(OnRegistrationRequest.class) // this one is "@Valid" with a specified group and will be used for return value validation
@ResponseStatus(HttpStatus.CREATED)
public KidDTO createKidRegistration(@RequestBody @Valid /* this one is for method parameter */ KidDTO kid) {
return kidService.saveKid(kid);
}

查看屏幕截图中的不同路径。一是createKidRegistration.kid.firstName这就是参数。如果您只需要使用特定组验证传递的参数,您应该尝试替换 @Valid@Validated(OnRegistrationRequest.class) ,并删除 @Validated完全从方法层面来说。

关于java - 使用组时 Spring Boot 2 剩余 validator 调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com