Не удается заставить RestTemplate работать правильно. Заканчивается в 406 г. Недопустимо
Я пытаюсь использовать RestTemplate Spring для внедрения провайдера платежей в проект, над которым я работаю. XML, возвращаемый поставщиком платежа, выглядит следующим образом:
<?xml version="1.0" ?>
<response>
<bank>
<bank_id>0031</bank_id>
<bank_name>ABN AMRO</bank_name>
</bank>
<bank>
<bank_id>0761</bank_id>
<bank_name>ASN Bank</bank_name>
</bank>
<bank>
<bank_id>0091</bank_id>
<bank_name>Friesland Bank</bank_name>
</bank>
<bank>
<bank_id>0721</bank_id>
<bank_name>ING</bank_name>
</bank>
<bank>
<bank_id>0021</bank_id>
<bank_name>Rabobank</bank_name>
</bank>
<bank>
<bank_id>0771</bank_id>
<bank_name>RegioBank</bank_name>
</bank>
<bank>
<bank_id>0751</bank_id>
<bank_name>SNS Bank</bank_name>
</bank>
<bank>
<bank_id>0511</bank_id>
<bank_name>Triodos Bank</bank_name>
</bank>
<bank>
<bank_id>0161</bank_id>
<bank_name>van Lanschot</bank_name>
</bank>
<message>This is the current list of banks and their ID's that currently support iDEAL-payments</message>
</response>
Классы, которые я создал для этого XML:
@XmlRootElement(name="response")
public class ResponseBanks {
private List<Bank> banks;
private String message;
public void setBanks(List<Bank> banks) {
this.banks = banks;
}
@XmlElement(name="bank")
public List<Bank> getBanks() {
return banks;
}
@XmlElement(name="message")
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
@XmlRootElement(name="bank")
public class Bank {
private String bank_id;
private String bank_name;
@XmlElement(name="bank_id")
public String getBank_id() {
return bank_id;
}
public void setBank_id(String bank_id) {
this.bank_id = bank_id;
}
@XmlElement(name="bank_name")
public String getBank_name() {
return bank_name;
}
public void setBank_name(String bank_name) {
this.bank_name = bank_name;
}
}
Если я просто запрашиваю xml в виде строки и отменяю их сам, это работает:
String banksAsString = restTemplate.getForObject("https://secure.mollie.nl/xml/ideal?a=banklist", String.class);
try {
JAXBContext jc = JAXBContext.newInstance(ResponseBanks.class);
Unmarshaller um = jc.createUnmarshaller();
ResponseBanks banks = (ResponseBanks) um.unmarshal(new StringReader(banksAsString));
}
catch (JAXBException e) {
e.printStackTrace();
}
Однако, если я сделаю это:
ResponseBanks banksAsObject = restTemplate.getForObject("https://secure.mollie.nl/xml/ideal?a=banklist", ResponseBanks.class);
или же
Source banksAsSource = restTemplate.getForObject("https://secure.mollie.nl/xml/ideal?a=banklist", Source.class);
это заканчивается в 406 неприемлемо.
Моя bean-конфигурация для restTemplate (которая @Autowired в контроллере) выглядит следующим образом:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="jaxbMarshaller"/>
<property name="unmarshaller" ref="jaxbMarshaller"/>
</bean>
</list>
</property>
</bean>
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>nl.mollie.api.ResponseBanks</value>
</list>
</property>
</bean>
Кто-нибудь знает, что вызывает это и как это исправить? URL в приведенном выше коде общедоступен, так что вы можете попробовать этот код самостоятельно.
3 ответа
Для вас использовать
Content-type
в качестве
application/xml
, вам необходимо настроить следующий конвертер сообщений:
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(mappingJacksonHttpMessageConverter(objectMapper()));
}
private MappingJackson2XmlHttpMessageConverter createXmlHttpMessageConverter() {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
builder.indentOutput(true);
return new MappingJackson2XmlHttpMessageConverter(builder.build());
}
и добавьте это в свой
pom.xml
файл:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson-dataformat-xml.version}</version>
</dependency>
Добавление в качестве ответа, так как не хватает оценки репутации, чтобы комментировать.
@Maciej, ссылка, которую вы разместили выше, не работает. У вас есть этот контент где-нибудь еще? Пожалуйста, постарайтесь поместить ключевое содержание по ссылке при публикации ссылок.
406 Not Acceptable
похоже на проблему с MIME-типами / согласованием контента.
Веб-служба, с которой вы пытаетесь установить связь, не отправляет Content-type
, Если этот веб-сервис реализован вами или вашими коллегами, есть ли у вас @Produces("application/xml")
аннотации к вашему методу веб-сервиса JAX-RS?
Подробнее здесь: https://cwiki.apache.org/WINK/jax-rs-request-and-response-entities.html