如何在 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 配置文件处于活动状态。