#spring #spring-boot #spring-cloud-feign #feign #openfeign
#spring #spring-загрузка #spring-cloud-симулировать #симулируйте #openfeign
Вопрос:
Я вызываю сторонний API, который возвращает ответ в формате XML. Поскольку я не создал никакого POJO для удержания ответа в моем потребительском сервисе, я использую java.lang.Object
его для того же.
Я получаю следующую ошибку.
org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class java.lang.Object] and content type [application/xml]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
at org.springframework.cloud.openfeign.support.SpringDecoder.decode(SpringDecoder.java:59) ~[spring-cloud-openfeign-core-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.cloud.openfeign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:62) ~[spring-cloud-openfeign-core-2.2.5.RELEASE.jar:2.2.5.RELEASE]
Мой симулированный клиентский код
@FeignClient(value = "SERVICE", url = "https://goog.dummyservice/api1/v1", decode404 = true)
public interface UserFeign {
@GetMapping(value = "/docs/{profile}/{protocol}", consumes = MediaType.APPLICATION_XML_VALUE)
Object getUserData(@RequestHeader("Authorization") String token,
@PathVariable("profile") String profile,
@PathVariable("protocol") String protocol);
}
Я хотел знать, как сохранить XML-ответ с помощью feign.
Комментарии:
1. вы смогли это выяснить?
Ответ №1:
FeignClientConfiguration.java
@Configuration
@RequiredArgsConstructor
public class FeignClientConfiguration {
private final ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new FormEncoder(new SpringEncoder(messageConverters));
}
/*@Bean
public Decoder feignDecoder() {
MappingJackson2XmlHttpMessageConverter c = new MappingJackson2XmlHttpMessageConverter();
ObjectFactory<HttpMessageConverters> objectFactory = () ->new HttpMessageConverters(c);
return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
}*/
}
ConsultaClient.java
@FeignClient(url = "${api.serpro.url}",
name = "name",
configuration = FeignClientConfiguration.class)
public interface ConsultaClient {
@PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
@Headers("Content-Type: application/x-www-form-urlencoded")
List<DocumentoDTO> getData(ParamsDTO params);
}
Ответ №2:
Приведенная ниже последовательность шагов помогла мне решить эту проблему:
1 — Добавьте зависимость jackson-dataformat-xml в свой pom.xml
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.14.1</version>
</dependency>
2 — Добавьте эту настроенную конфигурацию в UserFeign.java
@FeignClient(value = "SERVICE", url = "https://goog.dummyservice/api1/v1", decode404 = true, configuration = UserFeign.Configuration.class)
public interface UserFeign {
@GetMapping(value = "/docs/{profile}/{protocol}", consumes = MediaType.APPLICATION_XML_VALUE)
Object getUserData(@RequestHeader("Authorization") String token,
@PathVariable("profile") String profile,
@PathVariable("protocol") String protocol);
class Configuration {
@Bean
public Decoder feignDecoder() {
return (response, type) -> {
String bodyStr = Util.toString(response.body().asReader(Util.UTF_8));
JavaType javaType = TypeFactory.defaultInstance().constructType(type);
return new XmlMapper().readValue(bodyStr, javaType);
};
}
}
}