如何在春季启动中根据环境拥有不同的@JsonProperty



我有一个类,它被用作访问另一个服务的请求。

它很少有像下面这样的字段。

public class RequestClass {
@JsonProperty("123")
private String name;
@JsonProperty("124")
private String email;
@JsonProperty("129")
private String mobile;
}

上游服务需要具有字段id的请求,如123124129等。

这些字段id将因测试和生产环境而异。

除了拥有不同的RequestClass之外,还有什么更好的方法可以做到这一点吗?

您可以创建一个配置类,根据环境跟踪实际id,并使用jackson的@JsonAnyGetter进行映射。

例如,如果您有以下application.properties(我在这里使用多文档道具,但每个配置文件也可以有application.properties(:

spring.profiles.active=dev
#---
spring.config.activate.on-profile=dev
application.requestClass.nameId=123
#---
spring.config.activate.on-profile=test
application.requestClass.nameId=456

然后,您将创建您的配置类(我使用Lombok的@Data用于getter/setters(:

@Configuration
@Data
public class RequestClassConfig {
@Value("${application.requestClass.nameId}")
private String nameId;
@PostConstruct
public void postConstruct() {
RequestClass.config = this;
}
}

最后是@JsonAnyGetter:的DTO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RequestClass {
public static RequestClassConfig config;
@JsonIgnore
private String name;
@JsonAnyGetter
public Map<String, Object> any() {
final var map = new HashMap<String, Object>();
map.put(config.getNameId(), this.name);
return map;
}
}

请注意,您可以对其余的道具进行同样的操作,为了简洁起见,我只是省略了这些。

现在进行快速测试:

@SpringBootApplication
public class App {
public static void main(String[] args) throws JsonProcessingException {
SpringApplication.run(App.class, args);
final var mapper = new ObjectMapper();
final var req = new RequestClass();
req.setName("test");
System.out.println(mapper.writeValueAsString(req));
}
}

这将打印如果dev配置文件处于活动状态,则将{"123":"test"}发送到控制台和如果test配置文件处于活动状态,则为{"456":"test"}

最新更新