gpt4 book ai didi

java - 使用 Jackson 和 Spring Boot 的条件 JsonProperty

转载 作者:行者123 更新时间:2023-11-30 07:38:02 26 4
gpt4 key购买 nike

Spring Boot 应用程序的任务是每隔几分钟更新一次远程集成 API。该应用程序可以部署到测试或生产环境,应用程序被告知它应该通过“application.properties”标志查看的端点。 POJO 正在使用 Jackson 进行序列化并推送到端点,其中 JsonProperty 注释包含要推送到的 API 的字段 ID。

@JsonProperty("field_001)
private String name;

@JsonProperty("field_002)
private String address;

这些值的字段标签在测试端点上有所不同。因此测试端点可能期望属性映射为

@JsonProperty("field_005)
private String name;

@JsonProperty("field_006)
private String address;

我希望能够利用 Spring Boot 对基于配置文件的属性文件的 native 支持。在运行时从外部属性文件读取 JsonProperty 注释值。

例如,

可能有三个文件 application.properties、application-test.properties 和 application-prod.properties。除了基于“spring.profiles.active”设置的普通属性文件之外,Spring Boot 还可以读取测试或产品属性。<​​/p>

...-test.properties 将包含测试服务器字段的常量值。并且 ...-prod.properties 将包含 prod 服务器字段的常量值。

嵌套注解,例如Spring的@Value标签,如下所示:

@JsonProperty(@Value("${property.file.reference.here})) 

似乎不起作用。

最佳答案

对于重新提出一个旧问题,我深表歉意,但我仍然无法找到满意的答案。

这是我使用扩展的 JacksonAnnotationIntrospector 的解决方案,它允许在 @JsonProperty 注释中使用 ${environment.properties}

首先扩展内省(introspection)器

public class DynamicJacksonAnnotationIntrospector extends JacksonAnnotationIntrospector {
private final Environment environment;

public DynamicJacksonAnnotationIntrospector(Environment environment) {
this.environment = environment;
}

@Override
public PropertyName findNameForSerialization(Annotated a) {
PropertyName name = super.findNameForSerialization(a);
if (name == null) {
return null;
}
String simpleName = name.getSimpleName();
return PropertyName.construct(environment.resolvePlaceholders(simpleName), name.getNamespace());
}
//For deserialization I think the same mechanism could be used,
//just override `findNameForDeserialization`, although I haven't tested it
}

然后将其与ObjectMapper配置一起使用

@Configuration
public class ObjectMapperConfiguration {
@Bean
public ObjectMapper getObjectMapper(DynamicJacksonAnnotationIntrospector introspector) {
ObjectMapper mapper = new ObjectMapper();
SerializationConfig config = mapper.getSerializationConfig().withInsertedAnnotationIntrospector(introspector);
mapper.setConfig(config);
return mapper;
}

@Bean
public DynamicJacksonAnnotationIntrospector introspector(Environment environment) {
return new DynamicJacksonAnnotationIntrospector(environment);
}
}

示例:

public class DynamicTestClass {
@JsonProperty("${dynamic.property.name}")
private String dynamicPropertyName;
//getters/setters
}
@ContextConfiguration(classes = [
ObjectMapperConfiguration
])
@TestPropertySource("classpath:test.properties")
class DynamicJacksonAnnotationIntrospectorTest extends Specification {
@Autowired
ObjectMapper mapper

def "should find name for serialization from properties"() {
def bean = new DynamicTestClass()
bean.dynamicPropertyName = "qwerty"

when:
def result = mapper.writeValueAsString(bean)

then:
result == "{\"overriddenName\":\"qwerty\"}"
}
}

测试.属性

dynamic.property.name=overriddenName

该解决方案是反向兼容的,因此您仍然可以在 @JsonProperty 中使用常量值

关于java - 使用 Jackson 和 Spring Boot 的条件 JsonProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com