我有一个类,它被用作访问另一个服务的请求。
它很少有像下面这样的字段。
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"}
。