Java Spring@validated未级联到字段

Java Spring@validated未级联到字段,java,spring,spring-validator,Java,Spring,Spring Validator,我需要使用组,以便我可以使用相同的DTO来创建和修补;然而,这些操作的要求明显不同。因此,我决定使用Spirng的@Validated,而不是@Valid和组。以下是我的代码的简化版本: class PersonDto{ @NotBlank(groups = CreateConstraint.class) private String phoneNumber; @NotNull(groups = CreateConstraint.class) @Valid private AddressDto

我需要使用组,以便我可以使用相同的DTO来创建和修补;然而,这些操作的要求明显不同。因此,我决定使用Spirng的@Validated,而不是@Valid和组。以下是我的代码的简化版本:

class PersonDto{ 
@NotBlank(groups = CreateConstraint.class)
private String phoneNumber;
@NotNull(groups = CreateConstraint.class)
@Valid
private AddressDto address;
}
在AddressDto中,我使用了默认组:

@Getter
@Setter
public class AddressDto {
@NotBlank
private String line1;
private String line2; 
private String city;
@NotNull
private Province province;
@NotBlank
private String postalCode;
}
以及控制器:

@PatchMapping("/patch")
public void patchPerson(@RequestBody @Validated PersonDto dto) {
personService.patchPerson(dto);}
在这里的控制器中,我也使用默认组。现在,除非我在PersonDto中显式地将
@Valid
添加到AddressDto声明中,否则不会对AddressDto进行验证。为什么@Validated没有级联到PersonDto中的字段?谢谢

编辑
我只是想说清楚。想知道为什么
@Validated
不是…

您还必须将验证组添加到级联字段中。 例如,检查CreateConstraint组的line1字段。 此外,还必须在控制器中指定验证组

@Getter
@Setter
public class AddressDto {
    @NotBlank(groups = CreateConstraint.class)
    private String line1;
    private String line2; 
    private String city;
    @NotNull()
    private Province province;
    @NotBlank()
    private String postalCode;
}

@PatchMapping("/patch")
public void patchPerson(@RequestBody @Validated({CreateConstraint.class})PersonDto dto) {
    personService.patchPerson(dto);
}

您还必须将验证组添加到级联字段中。 例如,检查CreateConstraint组的line1字段。 此外,还必须在控制器中指定验证组

@Getter
@Setter
public class AddressDto {
    @NotBlank(groups = CreateConstraint.class)
    private String line1;
    private String line2; 
    private String city;
    @NotNull()
    private Province province;
    @NotBlank()
    private String postalCode;
}

@PatchMapping("/patch")
public void patchPerson(@RequestBody @Validated({CreateConstraint.class})PersonDto dto) {
    personService.patchPerson(dto);
}

因为这是JSR描述的行为。您必须明确地定义对象图上的验证点。但是,如果是有效的,为什么不验证呢。。。JSR303说:给定关联(即对象引用或集合、数组、对象的Iterable)上的@Valid注释指示Bean验证器实现在关联对象上递归应用Bean验证例程。此机制是递归的:关联对象本身可以包含级联引用。Validated用于验证信息组。例如,在第一步中,仅验证工作流中的form1值,然后验证form2等。因此,您可以这样使用它:@Validation(ClassToValidateForm1),在您的模型中,您可以向@Email(group=ClassToValidateForm1)等字段添加组,因为这是JSR描述的行为。您必须明确地定义对象图上的验证点。但是,如果是有效的,为什么不验证呢。。。JSR303说:给定关联(即对象引用或集合、数组、对象的Iterable)上的@Valid注释指示Bean验证器实现在关联对象上递归应用Bean验证例程。此机制是递归的:关联对象本身可以包含级联引用。Validated用于验证信息组。例如,在第一步中,仅验证工作流中的form1值,然后验证form2等。所以您可以这样使用它:@Validation(ClassToValidateForm1),在您的模型中,您可以将组添加到您的字段中,如@Email(group=ClassToValidateForm1)。不正确,您可以使用默认组。但这不是问题所在。即使您添加它们并在控制器中使用@Validated,您仍然需要在地址上使用Valid,无论验证是否级联。不正确,您可以使用默认组。但这不是问题所在。即使您添加它们并在控制器中使用@Validated,您仍然需要在地址上使用Valid,无论验证是否级联。