首页 > 解决方案 > Spring Boot ConfigurationProperties - 未映射基类

问题描述

我正在尝试设置一个使用具有相同基类的不同属性的 spring-boot 配置。问题是基本类型始终为空。

我这样做是因为我想要不同的配置元素,它们具有一组必需的属性并且还具有一些附加属性。

对于上下文:配置文件如下所示,并保存为 JSON:

{
  // some other properties
  "layout": {
    "test": 1,
    "element": {
      "@type": "traffic",
      "id": "id-1",
      "district": "district"
    }
  }

对于此布局属性,我使用以下类:

@ConfigurationProperties(prefix = "layout")
@ToString
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class LayoutProperties {
    /* This is always correct */
    private int test;
    /* This is always null! */
    private LayoutObject element;
}

基类如下所示:

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = TrafficLayoutObject.class, name = "traffic"),
})
public abstract class LayoutObject {
    public abstract String getId();
}

我按照一些教程中的建议使用@JsonTypeInfo@JsonSubTypes注释。

这个类的一个实现是这样的:

@ConstructorBinding
@ToString
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TrafficLayoutObject extends LayoutObject {
    private String id;
    private String district;
}

这实质上增加了一个额外的区域字段。

现在的问题是,每当我启动我的应用程序时,如果声明为 LayoutObject 的元素字段为空。但是,当使用特定类型(例如 TrafficLayoutObject)时,该字段由 spring 正确填充。

另一个有趣的事情是杰克逊似乎正确地处理了这个问题,因为当从配置中反序列化布局对象时,一切都被正确填充。

我错过了什么?还是有更好的方法来做到这一点?

标签: javaspring-boot

解决方案


推荐阅读