【问题标题】:Spring Resttemplate exchange method to call a PATCH requestSpring Resttemplate 交换方法调用 PATCH 请求
【发布时间】:2018-11-27 11:47:29
【问题描述】:

我有一个带有 spring 框架的 java 8 应用程序。我们需要从我们的应用程序中使用 REST 调用补丁操作。

sn-p代码如下:

import com.xyz.myobject.ResponseAdmission;
import com.xyz.myobject.RequestAdmission;

@Repository
public class AdmissionRepository {

   @Autowired
   private RestTemplate restTemplate;

   public ResponseObject updateAdmission(RequestAdmission requestAdmission, String admissionId) {

   UriBuilder uriBuilder =  UriBuilder.fromUri("https://admissionportal.com").path("admission").path("admissionId="+admissionId);

   HttpEntity<RequestAdmission> admissionEntity = new HttpEntity<>(requestAdmission, this.getHeaders);

   ResponseEntity<ResponseAdmission> responseEntity = this.restServiceESBSupport.exchange(uriBuilder.build(), HttpMethod.PATCH, admissionEntity , ResponseAdmission.class);

   return responseEntity.getBody();

}

public MultiValueMap<String, String> getHeaders() {
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        headers.add("Accept", "application/xml");
        headers.add("Content-Type", "application/xml");
        return headers;
    }

}

当我执行上面的代码时,当执行带有'exchange'关键字的行时,它会给出一个错误:

org.springframework.web.client.RestClientException: 无法写入请求:没有为请求类型 [com.xyz.myobject.RequestAdmission] 和内容类型 [application/xml] 找到合适的 HttpMessageConverter

当我调试代码时,restTemplate 注册了以下 7 个转换器:

ByteArrayHttpMessageConverter,
StringHttpMessageConverter,
ResourceHttpMessageConverter,
SourceHttpMessageConverter,
AllEncompassingFormHttpMessageConverter,
Jaxb2RootElementHttpMessageConverter,
MappingJackson2HttpMessageConverter

我还尝试添加以下行:

this.restTemplate.getMessageConverters().add(new Jaxb2RootElementHttpMessageConverter());

但还是不行。

RequestAdmission 和 ResponseAdmission 是从 xsds 生成的 JAXB POJO 对象。

webservice接受xml形式的请求,响应也是xml形式。

请指教。

【问题讨论】:

  • 对于 XML,您可以使用简单的字符串作为实体主体,而无需编写任何自定义转换器。
  • 我不想要字符串中的输出,而是响应对象。这里它无法将 POJO 转换为 xml。请在代码更改时提及解决方案。
  • 我说可以使用String作为http请求实体体,而不是响应。您的错误日志显示它无法编写请求,它没有提及您的响应。所以问题出在请求上。
  • 那么代码中需要做哪些修改。

标签: java spring rest spring-rest


【解决方案1】:

您可以创建自己的 XML 作为字符串并在您的请求中使用它,如下所示:

@Repository
public class AdmissionRepository {

   @Autowired
   private RestTemplate restTemplate;

   public ResponseObject updateAdmission(RequestAdmission requestAdmission, String admissionId) {

   UriBuilder uriBuilder =  UriBuilder.fromUri("https://admissionportal.com").path("admission").path("admissionId="+admissionId);
   String xmlString = // create an actual valid XML string with all the <tag>value</tag> and the whole structure.
   HttpEntity<String> admissionEntity = new HttpEntity<>(xmlString, this.getHeaders);

   ResponseEntity<ResponseAdmission> responseEntity = this.restServiceESBSupport.exchange(uriBuilder.build(), HttpMethod.PATCH, admissionEntity , ResponseAdmission.class);

   return responseEntity.getBody();

}

【讨论】:

  • 在这种情况下,它给出错误:org.springframework.web.client.RestClientException:无法写入请求:没有找到适合请求类型 [java.lang.String] 和内容类型 [application /xml],
  • 无需在标题中指定内容类型。会被消息格式识别,只要传递一个有效的xml即可。
猜你喜欢
  • 2015-06-09
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2020-03-28
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多