1

使用 Spring Rest 模板调用 Rest Web 服务,如下所示:

ResponseEntity<String> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, entity, String.class); 

并以字符串格式获取输出

<Info xmlns="http://schemas.test.org/2009/09/Tests.new" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>FirstName</FirstName>
<LastName>LastName</LastName>
<TestGuid>Guid</TestGuid>
<TestUID>1</TestUID>
<Token>token</Token>
<TestUserID>14</TestUserID>
</Info>

尝试将其解组为 java 类时,如下所示

ResponseEntity<Info> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, entity, Info.class)

Info 类定义为

@XmlRootElement(name = "Info", namespace = "http://schemas.test.org/2009/09/Tests.new")
public class Info implements Serializable{

    private String FirstName;
    private String LastName;
    private String TestGuid;
    private String TestUID;
    private String Token;
    private String TestUserID;

    //getters and setter

}   

如果响应 http 代码为 500,则响应不是 info 类型,而是其他类型的 infoException。

我们可以指定 resttemplate 根据 Http 响应代码解组输出吗?

4

3 回答 3

3

其余模板在提取数据之前检查响应是否有错误。因此,一种方法是使用ResponseErrorHandler的实现创建 Rest Template并覆盖 handleError 方法以使用转换器提取对您的对象的错误响应,然后将此错误对象包装到异常中。像这样的东西。

    class ErrorObjectResponseHandler implements ResponseErrorHandler {

      private List<HttpMessageConverter<?>> messageConverters;

      @Override
      public boolean hasError(ClientHttpResponse response) throws IOException {
        return hasError(response.getStatusCode());
      }

      protected boolean hasError(HttpStatus statusCode) {
        return (statusCode.is4xxClientError() || statusCode.is5xxServerError());
      }

      @Override
      public void handleError(ClientHttpResponse response) throws IOException {
        HttpMessageConverterExtractor<Error> errorMessageExtractor =
          new HttpMessageConverterExtractor(Error.class, messageConverters);
        Error errorObject = errorMessageExtractor.extractData(response);
        throw new SomeException(errorObject);
      }

      public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        this.messageConverters = messageConverters;
      }
于 2016-06-02T09:06:50.500 回答
2

Spring 5ExtractingResponseErrorHandler专门为此目的提供

于 2017-09-19T18:56:13.213 回答
0

由于从 XML 到类的映射,它的 XML 到 POJO 无法反序列化。尝试使用这个 POJO。

public class Info implements Serializable{

    private String TestGuid;

    private String TestUID;

    private String FirstName;

    private String xmlns;

    private String Token;

    private String LastName;

    private String TestUserID;

    //getters and setter
}
于 2016-06-02T06:53:30.143 回答