Spring FeignClient - обрабатывать RESTful xml ответ как JSON - PullRequest
0 голосов
/ 25 февраля 2020

Я использую Spring FeignClient для доступа к конечной точке RESTful, конечная точка возвращает xml, я хочу получить ответ в виде JSON, который, в свою очередь, сопоставится с POJO.

1) When I access the endpoint on the browser, I get response as below, 
<ns3:Products xmlns:ns2="http://schemas.com/rest/core/v1" xmlns:ns3="http://schemas/prod/v1">
<ProductDetails>
<ProdId>1234</ProdId>
<ProdName>Some Text</ProdName>
</ProductDetails>
</ns3:Products>


2) @FeignClient(value = "productApi", url = "http://prodservice/resources/prod/v1")
public interface ProductApi {

   @GetMapping(value="/products/{productId}", produces = "application/json")
   ProductDetails getProductDetails(@PathVariable("productId") String productId) 

    // where, /products/{productId} refers the RESTful endpoint 
    // by mentioning, produces = "application/json", I believe the response xml would be converted to JSON Java POJO. 


3) POJO
public class ProductDetails {
private String ProdId;
private String ProdName;

//...setters & getters 
} 

4) Service Layer 
ProductDetails details = productApi.getProductDetails(productId); 

В объекте 'details' ProdId и ProdName имеют значение null. Я что-то здесь упускаю? Во-первых, возможно ли получить ответ как JSON вместо XML?

1 Ответ

0 голосов
/ 25 февраля 2020

Если эта служба RESTful запрограммирована на возвращение только xml -ответа, то вы не можете попросить ее дать вам json ответ.

Но в вашем случае проблема заключается в классе, где вы хочу отобразить результат. Этот ответ xml фактически оборачивает тег ProductDetails в ns3:Products.

. Поэтому вам нужно создать другой класс, который будет содержать ссылку на ProductDetails объект:

public class Product {   //class name can be anything 
    private ProductDetails ProductDetails;
    //getters, setters
}

Тогда измените тип метода getProductDetails на Product.

Если в ответе все еще есть пустые значения, то это, вероятно, из-за конфигурации ObjectMapper. Но вы всегда можете добавить аннотацию @JsonProperty для своих полей (в этом случае это будет @JsonProperty("ProductDetails") для ProductDetails поля в Product, @JsonProperty("ProdId") и @JsonProperty("ProdName") для полей в ProductDetails).

...