我正在尝试使用一个包含Map的json,但是没有任何效果。我得到的只是空。
我尝试将getForObject()和getForEntity()方法与包装类ConsulServicesResponse.class的类型化响应类型一起使用,但是没有任何效果。使用Object代替ConsulServicesResponse可以很好地工作,但是我宁愿使用严格的类型化。
我有这样的json,来自我的领事代理api:
{
"synchronizer-1-0": {
"ID": "synchronizer-1-0",
"Service": "synchronizer-1-0",
"Tags": [
"synchronize"
],
"Meta": {},
"Port": 8080,
"Address": "localhost",
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false
}
}
如您所见,“ synchronizer-1-0”:{...}是一个映射。我创建了一个模型,该模型应用于消费: 这是一个响应包装器:
@Getter
@Setter
public class ConsulServicesResponse {
@JsonProperty
private String name;
@JsonProperty
private ConsulService services;
}
这是值POJO:
@NoArgsConstructor
@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public class ConsulService implements Serializable {
@JsonProperty(value = "ID")
private String id;
@JsonProperty(value = "Service")
private String service;
@JsonProperty(value = "Tags")
private String[] tags;
@JsonProperty(value = "Meta")
private String meta;
@JsonProperty(value = "Port")
private Integer port;
@JsonProperty(value = "Address")
private String address;
@JsonProperty(value = "Weights")
private Weights weights;
@JsonProperty(value = "EnableTagOverride")
private Boolean enableTagOverride;
private class Weights {
@JsonProperty(value = "Passing")
private Integer passing;
@JsonProperty(value = "Warning")
private Integer warning;
}
}
为进行正确的序列化/反序列化,我将默认映射添加到我的RestTemplate bean中,如下所示:
@Configuration
public class AppConfiguration {
@Bean
RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
return restTemplate;
}
@Bean
@Scope("singleton")
ConsulCache consulCache(){
return new ConsulCache();
}
}
最后,在我的控制器中,我使用了我调用restTemplate的服务:
@Component
public class ConsulCacheUpdater {
private static final Logger log = LoggerFactory.getLogger(ConsulCacheUpdater.class);
private final String AGENT_PREFIX = "v1/agent/";
private final String CONSUL_SERVICES = "services";
private final String PRETTY_VIEW = "?pretty";
@Autowired
ApplicationContext ctx;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
Environment environment;
@Autowired
private RestTemplate restTemplate;
@Autowired
private ConsulCache consulCache;
@Scheduled(initialDelay = 3_000, fixedRate = 30_000)
public void updateServiceList(){
String consul_url = String.format("http://%s:%s/%s%s",
environment.getProperty("spring.cloud.consul.host"),
environment.getProperty("spring.cloud.consul.port"),
AGENT_PREFIX,
CONSUL_SERVICES + PRETTY_VIEW);
ResponseEntity<ConsulServicesResponse> response = restTemplate.exchange(
consul_url,
HttpMethod.GET,
null,
ConsulServicesResponse.class);
if (response.getStatusCode().equals(HttpStatus.OK)){
ConsulServicesResponse cs = response.getBody();
}
}
}
因此,我的CS为空。我在做什么错了?