Код: Выделить всё
text/xmlЭто пример данных, которые возвращает внешний API:
< pre class="lang-xml Prettyprint-override">
Код: Выделить всё
Someone
Я создал этот класс:
Код: Выделить всё
@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "Player")
@XmlAccessorType(XmlAccessType.FIELD)
public class PlayerModel {
@XmlElement(name = "NAME")
private String name;
}
Код: Выделить всё
RestClient restClient = RestClient.create();
PlayerModel result = restClient.get()
.uri(url)
.retrieve()
.body(PlayerModel.class);
Затем я прочитал весеннюю документацию о клиентах REST и преобразовании HTTP-сообщений. Там говорилось, что существует множество HttpMessageConverter, и что каждый из них имеет тип носителя по умолчанию, который он поддерживает. Я предполагаю, что все, что RestClient использует по умолчанию, не поддерживает по умолчанию тип text/xml, поэтому я решил использовать один из предложенных. Я был между MarshallingHttpMessageConverter и MappingJackson2XmlHttpMessageConverter.
С MarshallingHttpMessageConverter у меня возникли проблемы, так как я хотел использовать Unmarshaller, созданный на основе JAXBContext (далее будет код об этом), который создает Unmarshaller из jakarta.xml.bind.Unmarshaller. Однако при создании MarshallingHttpMessageConverter, если вы попытаетесь передать ему этот Unmarshaller (он принимает как Unmarshaller, так и Marshaller), произойдет сбой, поскольку он ожидает Unmarshaller от org.springframework.oxm.Unmarshaller . Не знаю, но, возможно, то, что мне нужно, близко к этому.
Поскольку это не совсем сработало, я использовал MappingJackson2XmlHttpMessageConverter, вот так:
Код: Выделить всё
RestClient restClient = RestClient.builder()
.messageConverters(converters -> {
MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_XML, MediaType.TEXT_XML));
converters.add(converter);
})
.build();
Наконец, я решил перехватить его как строку вместо PlayerModel и использовать JAXB создал Unmarshaller для демаршалинга XML-содержимого строки в playerModel:
Код: Выделить всё
RestClient restClient = RestClient.builder()
.messageConverters(converters -> {
MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_XML, MediaType.TEXT_XML));
converters.add(converter);
})
.build();
String result = restClient.get()
.uri(url)
.retrieve()
.body(String.class);
PlayerModel playerModel;
try {
Unmarshaller unmarshaller = JAXBContext.newInstance(PlayerModel.class).createUnmarshaller();
playerModel = (PlayerModel) unmarshaller.unmarshal(new StringReader(result));
} catch (JAXBException e) {
throw new RuntimeException(e);
}
return playerModel;
Код: Выделить всё
PlayerModel result = restClient.get()
.uri(url)
.retrieve()
.body(PlayerModel.class);
Подробнее здесь: https://stackoverflow.com/questions/776 ... l-response
Мобильная версия