Spring RestTemplate getForObject Map отображение классов - PullRequest
1 голос
/ 10 апреля 2020

У меня есть следующий POJO:

class TestPojo {

    private Long testId = null;
    private String testString = null;
    private boolean testBoolean = false;
    private Float testFloat = null;
    private int testInt = 0;
    private Collection<String> testCollection = new TreeSet();

    Long getTestId() {
        return testId;
    }

    void setTestId(Long testId) {
        this.testId = testId;
    }

    String getTestString() {
        return testString;
    }

    void setTestString(String testString) {
        this.testString = testString;
    }

    boolean getTestBoolean() {
        return testBoolean;
    }

    void setTestBoolean(boolean testBoolean) {
        this.testBoolean = testBoolean;
    }

    Float getTestFloat() {
        return testFloat;
    }

    void setTestFloat(Float testFloat) {
        this.testFloat = testFloat;
    }

    int getTestInt() {
        return testInt;
    }

    void setTestInt(int testInt) {
        this.testInt = testInt;
    }

    Collection<String> getTestCollection() {
        return testCollection;
    }

    void setTestCollection(Collection<String> testCollection) {
        this.testCollection = testCollection;
    }
}

У меня есть два остальных ответа API, один из которых возвращает один экземпляр TestPojo в формате JSON:

{
  "testId": 1,
  "testString": "testStringA",
  "testBoolean": false,
  "testFloat": 1.0,
  "testInt": 1,
  "testCollection": [
    "testCollectionA",
    "testCollectionB"
  ]
}

Другой Ответ API rest возвращает карту нескольких TestPojo:

{
  "TestPojoA": {
    "testId": 1,
    "testString": "testStringA",
    "testBoolean": false,
    "testFloat": 1.0,
    "testInt": 1,
    "testCollection": [
      "testCollectionA",
      "testCollectionB"
    ]
  },
  "TestPojoB": {
    "testId": 2,
    "testString": "testStringB",
    "testBoolean": true,
    "testFloat": 1.1,
    "testInt": 2,
    "testCollection": [
      "testCollectionC",
      "testCollectionB"
    ]
  }
}

Мой шаблон отдыха с MappingJackson2HttpMessageConverter правильно возвращает POJO для первого JSON:

RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
TestPojo testPojo = restTemplate.getForObject("http://127.0.0.1:8081/test/getPojoInstance", TestPojo.class);

Я не могу получить POJO на карте, чтобы правильно конвертировать, однако, однако? Я пробовал различные способы, я думал, что следующее будет работать, но это просто возвращает карту с двумя строковыми значениями вместо String & POJO:

RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
Map<String, TestPojo> testPojoMap = restTemplate.getForObject("http://127.0.0.1:8081/test/getPojoMap", Map<String, TestPojo>.class);

Я знаю, что могу преобразовать строковое значение в моей карте в TestPojo после того, как я получу ответ, но мне просто любопытно, если я что-то не так делаю в первую очередь?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я думаю, что это из-за проблемы с типом в getForObject , я бы предложил использовать exchange метод

ResponseEntity<Map<String, TestPojo>> response = template.exchange("http://127.0.0.1:8081/test/getPojoMap", 
         HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, TestPojo>>() {
});

Map<String, TestPojo> body = response.getBody();
0 голосов
/ 10 апреля 2020

RestTemplate может десериализовать JSON, как у вас, в java.util.Map, а не в java.util.Map<String, TestPojo>

. Вы можете использовать Jackson ObjectMapper, чтобы задать TypeReference

String testPojoMap = restTemplate.getForObject("http://127.0.0.1:8081/test/getPojoMap", String.class);
ObjectMapper objectMapper = new ObjectMapper();
Map<String, TestPojo> map = objectMapper.readValue(testPojoMap, new TypeReference<Map<String,TestPojo>>(){});

или

Без отдыха Templete

ObjectMapper objectMapper = new ObjectMapper();
Map<String, TestPojo> map = objectMapper.readValue("http://127.0.0.1:8081/test/getPojoMap", new TypeReference<Map<String,TestPojo>>(){});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...