2016-01-29 69 views
1

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

@JsonProperty("field_001) 
private String name; 

@JsonProperty("field_002) 
private String address; 

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

@JsonProperty("field_005) 
private String name; 

@JsonProperty("field_006) 
private String address; 

我希望能够利用的轮廓基础性文件的春天启动的原生支持。在运行时从外部属性文件中读取JsonProperty注释值。

因此,例如,

可能有三个文件application.properties,application-test.properties和application-prod.properties。 除了基于“spring.profiles.active”设置的vanilla属性文件外,Spring Boot还可以读取测试或prod属性。

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

嵌套注释,比如Spring的@Value标签,就像这样:

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

似乎并没有工作。

回答

0

我怀疑你可以在Jackson注释中使用Spring Expression Language(SpEL)来做到这一点,就像你尝试的那样(带或不带@Value注解)。

我会通过创建一个JsonSerializer<YourPojo>和/或JsonDeserializer<YourPojo>来执行此操作,它接受SpEL表达式并使用提供的字段名称创建(或读取)。

//make me a spring managed bean! 
public class PojoSerializer extends JsonSerializer<YourPojo> { 
    @Value("${property.file.reference.name") 
    private String nameField; 

    @Value("${property.file.reference.address") 
    private String addrField; 

    @Override 
    public void serialize(YourPojo pojo, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     jgen.writeStartObject(); 
     jgen.writeStringField(nameField, pojo.getName()); 
     jgen.writeStringField(addrField, pojo.getAddress()); 
     jgen.writeEndObject(); 
    } 
} 

由于这是一个Spring托管bean,您需要将其插入到您的Spring托管的ObjectMapper中。

ObjectMapper mapper = //my ObjectMapper from spring 
PojoSerializer pojoSerializer = //my PojoSerializer from spring 

SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null)); 
module.addSerializer(YourPojo.class, pojoSerializer); 
mapper.registerModule(module); 

对于SpringBoot的AutoConfiguration,这可能不是必须的。我通常不知道SpringBoot会为其Jackson配置提供什么,但JsonSerializerJsonDeserializer可能会在ApplicationContext中自动注册。

+0

是否可以使用序列化程序来指定POJO上只有几个字段的序列化?根据环境的不同,有近30个字段不会改变。理想情况下,序列化程序可以包含序列化服务器特定字段所需的逻辑,但让POJO上的@JsonProperty值处理其余部分。 – AldousP

+0

我对此表示怀疑,但我会指出我并不确定。 –

相关问题