【问题标题】:Use @JsonIgnore only for prodcution, but in tests it should be there仅将@JsonIgnore 用于生产,但在测试中它应该存在
【发布时间】:2021-06-08 14:00:37
【问题描述】:

我在 Kotlin 中有一个像这样的(数据)类。
在使用活动 Spring 配置文件 live 运行应用程序时,我只想返回 name
但是使用活动 Spring 配置文件 test 运行应用程序,我希望显示 version,这样我就可以测试我是否获得了正确的版本。

data class MyClass( 

 val name: String

 @JsonIgnore
 val version: Number

)

有可能吗?

【问题讨论】:

  • 我认为不可能,你可以使用@JsonProperty 并使用不同的json键来设置版本。但是您的用例不清楚,请提供一些您需要它的上下文。
  • uzxmx.github.io/add-or-remove-java-annotation-at-runtime.html 等;如果注释本身不支持某种形式的运行时自省,那么它本质上是不平凡的。 IIRC Jackson 确实通过JacksonAnnotationIntrospector 提供了某种形式(或至少提供了),但它可能需要修改对象映射器代码。
  • @RDK - 用例是:当我通过 REST 返回 MyClass 时,我不希望显示 version。但我需要验证它是我测试中的正确版本。 (更长的故事......这是简短的版本。)

标签: java json kotlin jackson fasterxml


【解决方案1】:

您可以使用不同的Jackson JSON Views 进行测试和生产环境。

data class MyClass( 
 @JsonView(Views.Prod.class,Views.Test.class)
 val name: String

 @JsonView(Views.Test.class)
 val version: Number

)

您必须通过基于环境传递视图来手动处理序列化/反序列化。

MyClass class = mapper
      .readerWithView(Views.<Required-view>.class)
      .forType(MyClass.class)
      .readValue(json);
String result = mapper
      .writerWithView(Views.<Required-view>.class)
      .writeValueAsString(class);

【讨论】:

    【解决方案2】:

    您可以使用@JsonInclude(Include.NON_NULL) 仅在它为非空时将其包含在响应中。然后,您可以在生产中运行时创建没有版本号的对象:

    data class MyClass( 
        val name: String,
    
        @JsonInclude(Include.NON_NULL)
        val version: Number? = null
    )
    
    // At creation:
    val myClass = if (prod) MyClass(name) else MyClass(name, version)
    

    【讨论】:

    • (导致可能的问题不是version没有使用,只是在序列化时不可见。)
    猜你喜欢
    • 2011-12-15
    • 2022-11-24
    • 2016-10-02
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多