java - 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 正确填充。
另一个有趣的事情是杰克逊似乎正确地处理了这个问题,因为当从配置中反序列化布局对象时,一切都被正确填充。
我错过了什么?还是有更好的方法来做到这一点?
解决方案
推荐阅读
- java - 从用户手机中检索图像
- c# - 将 C# DLL 导入 C++ 以与 JNI 一起使用
- javascript - 当我左右滑动轮播图像时,整个网站都在向下移动(仅适用于 ios 移动版)
- ruby-on-rails - 有时无法在常规 Web 应用程序中验证 CSRF 令牌的真实性
- java - 打开外部 URL 时“片段中的 startActivityForResult(Intent,int) 已弃用”的 Java 解决方案?
- angularjs - 使用 NGINX 在具有单个根文件夹的子目录中运行多个 Angular 应用程序
- linux - 在 64 位 Amazon Linux 2 实例上从源构建包的正确位置是什么?
- javascript - EJS - 包含来自 JSON 文件的配置
- javascript - 如何检查空数组的对象
- node.js - 如何以与前缀字段绑定的角度方式向数组添加新属性