如何在 spring 引导中根据环境使用不同的 @JsonProperty
How to have different @JsonProperty based on environment in spring boot
我有一个 class 用作访问另一个服务的请求。
它有几个像下面这样的字段。
public class RequestClass {
@JsonProperty("123")
private String name;
@JsonProperty("124")
private String email;
@JsonProperty("129")
private String mobile;
}
上游服务需要字段id为123、124、129等的请求
测试环境和生产环境的这些字段 ID 会有所不同。
除了使用不同的 RequestClass 之外,还有更好的方法吗?
您可以创建一个配置 class,根据您的环境跟踪实际 ID,并使用 jackson 的 @JsonAnyGetter.
映射它们
例如,如果您有以下 application.properties
(我在这里使用 multi-document props,但您也可以为每个个人资料设置 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
然后,您将创建您的配置 class(我使用 Lombok 的 @Data
作为 getter/setters):
@Configuration
@Data
public class RequestClassConfig {
@Value("${application.requestClass.nameId}")
private String nameId;
@PostConstruct
public void postConstruct() {
RequestClass.config = this;
}
}
最后你的 DTO @JsonAnyGetter
:
@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"}
到控制台
和
{"456":"test"}
如果 test
配置文件处于活动状态。
我有一个 class 用作访问另一个服务的请求。
它有几个像下面这样的字段。
public class RequestClass {
@JsonProperty("123")
private String name;
@JsonProperty("124")
private String email;
@JsonProperty("129")
private String mobile;
}
上游服务需要字段id为123、124、129等的请求
测试环境和生产环境的这些字段 ID 会有所不同。
除了使用不同的 RequestClass 之外,还有更好的方法吗?
您可以创建一个配置 class,根据您的环境跟踪实际 ID,并使用 jackson 的 @JsonAnyGetter.
映射它们例如,如果您有以下 application.properties
(我在这里使用 multi-document props,但您也可以为每个个人资料设置 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
然后,您将创建您的配置 class(我使用 Lombok 的 @Data
作为 getter/setters):
@Configuration
@Data
public class RequestClassConfig {
@Value("${application.requestClass.nameId}")
private String nameId;
@PostConstruct
public void postConstruct() {
RequestClass.config = this;
}
}
最后你的 DTO @JsonAnyGetter
:
@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"}
到控制台
和
{"456":"test"}
如果 test
配置文件处于活动状态。