java - 验证 Jackson 中的嵌套对象

标签 java json spring validation jackson

我有一个 spring 项目,并使用 jackson 进行 json 序列化和反序列化。

我已经定义了这些 DTO,

CertManDTO,

public class CertManDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private UUID certificateId;

    @NotNull
    private Long orgId;

    @NotNull
    private CertificateType certificateType;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @NotNull
    private PublicCertificateDTO publicCertificate;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private PrivateCertificateDTO privateCertificate;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private ZonedDateTime expiryDate;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private ZonedDateTime createdDate;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private ZonedDateTime updatedDate;

    // Getters and setters
}

公共(public)证书DTO,

public class PublicCertificateDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonIgnore
    private Long id;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @NotNull
    private String certificate;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @NotNull
    private String dnsZone;

    // Getters and setters
}

私有(private)证书DTO,

public class PrivateCertificateDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonIgnore
    private Long id;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String pkcs12;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String privateCertificatePassword;

    // Getters and setters
}

您可以在上面看到我已经为字段 certificatednzZone 设置了 @NotNull 注释。

但是发布这个 JSON 似乎解析成功。这只发生在嵌套对象上。

{  
   "orgId":"1001",
   "certificateType":"Single Use",
   "privateCertificate":{  
      "pkcs12":"test",
      "certificatePassword":"Test"
   },
   "publicCertificate":{  

   }
}

如果我发布以下内容,验证将失败,因为 publicCertificate 设置了 @NotNull

{  
   "orgId":"1001",
   "certificateType":"Single Use",
   "privateCertificate":{  
      "pkcs12":"test",
      "certificatePassword":"Test"
   }
}

我确实在 RestController 中为 @RequestBody 设置了 @Valid

知道是什么原因造成的吗?

最佳答案

您似乎忘记向嵌套 DTO 添加 @Valid 注释。尝试以下代码:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@NotNull
@Valid
private PublicCertificateDTO publicCertificate;

关于java - 验证 Jackson 中的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42709209/

相关文章:

spring - 在Spring MVC应用程序中实现Swagger的一种 'simple'方式

Java,尽管位于同一个包中,但未定义类型的方法

Java Spring Boot - 如何使用户能够从命令行切换数据文件?

php - 选择对 json 的多维数组进行查询

javascript - 仅从 Ajax JSON 调用返回特定值

java - Spring JDBC 获取查询返回的值

java - Easy mock 无法识别模拟服务

java - 如何使用 mapreduce wordcount 的输出进行进一步处理?

java - 用于选择没有后代 Java 的所有子节点的 XPath 表达式

java - 如何对字符串进行哈希处理,以便在任何地方修改字符时它几乎不会改变?