【问题标题】:Spring Boot can convert Xml response body to Java object, but can't convert Java object to Xml request bodySpring Boot 可以将 Xml 响应体转换为 Java 对象,但不能将 Java 对象转换为 Xml 请求体
【发布时间】:2017-10-13 08:53:38
【问题描述】:

当我尝试发送内容类型为 application/vnd.vmware.vcloud.session+xml;version=5.6 的请求时,spring boot 会出现以下异常:

请求处理失败;嵌套异常是 org.springframework.web.client.RestClientException:
无法写入 请求:没有找到适合请求类型的 HttpMessageConverter [com.vmware.vcloud.v1.SessionType] 和内容类型 [application/vnd.vmware.vcloud.session+xml;version=5.6]

但是当我收到来自服务器的响应时具有相同的内容类型 spring-boot 成功地将响应转换为SessionType 对象。

当我尝试发送请求时,为什么 spring boot 会出现上述异常?

【问题讨论】:

  • 如果您尝试使用 content-type 'application/xml' 发送会发生什么?原因描述得很清楚:“找不到合适的 HttpMessageConverter”。我可以猜到当你得到响应时,spring boot 使用 HttpMessageConverter 与“application/xml”内容类型相同
  • @yvs 当我将内容类型更改为 application/xml 时,我收到以下错误。没有为请求类型 [com.vmware.vcloud.v1.SessionType] 和内容类型 [application/xml] 找到合适的 HttpMessageConverter

标签: java xml spring spring-boot


【解决方案1】:

我发现了问题。 Jaxb2RootElementHttpMessageConverter 可以读取带有@XmlRootElement@XmlType 注释的类。

但它只能编写带有@XmlRootElement 注释的类。由于我的类没有用@XmlRootElement 注释,它的canWrite 方法返回false

@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
    return (clazz.isAnnotationPresent(XmlRootElement.class) || clazz.isAnnotationPresent(XmlType.class)) &&
            canRead(mediaType);
}

@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
    return (AnnotationUtils.findAnnotation(clazz, XmlRootElement.class) != null && canWrite(mediaType));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2012-12-22
    相关资源
    最近更新 更多