如何使用RestTemplate使用此类JSON?

时间:2019-07-10 13:00:55

标签: json dictionary resttemplate

我正在尝试使用一个包含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为空。我在做什么错了?

0 个答案:

没有答案