【问题标题】:org.springframework.http.InvalidMediaTypeException: Invalid mime type "XML;charset=ISO-8859-1": does not contain '/'org.springframework.http.InvalidMediaTypeException:无效的 MIME 类型“XML;charset=ISO-8859-1”:不包含“/”
【发布时间】:2020-12-09 15:37:39
【问题描述】:

我正在使用 SpringBoot(API1) 创建一个 REST API。它使用 RestTemplate(API2) 调用另一个 Rest API。 我调用的 API2 需要 xml 输入并提供 xml 输出。

API 2 发回的 XML 输出具有如下结构

    <xml>
    <IList>
        <IDetails>
            <Id>INC123</Id>
        </IDetails>
        <IDetails>
            <Id>INC124</Id>
        </IDetails>
    </IList>
</xml>

我创建的 Pojo 类如下:

 @Data
 @XmlRootElement(name="xml")

public class IResponse implements Serializable{
    
    private static final long serialVersionUID = 1L;
    @XmlElement(name="IList")
    public IList iList;
}


@Data
@XmlRootElement(name="IList")
public class IList implements Serializable{
    
    @XmlElement(name="IDetails")
    public List<IDetails> iDetails;

}

@Data
@XmlRootElement(name="IDetails")
public class IDetails implements Serializable{
    
    @XmlElement(name="Id")
    public String id;
}

我正在打的电话:

ResponseEntity<IList> response = restTemplate.exchange(urlTemplate, HttpMethod.POST, request, IList.class);

url Template 是我调用的 API2。

当执行 restTemplate.exchange 时,如果 200 Ok,我会得到状态代码,以及错误 Invalid mime type "XML;charset=ISO-8859-1": does not contain '/' 。当我调试代码时,我发现这是由包 org.springframework.web.client 中的 responseExtractor.extractData(response) 抛出的;和 doExecute 方法。

我发送的标头是

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE);
headers.add(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.name());

API 正在成功执行,原因是 API 执行的后端任务在我执行流程时发生,但我得到的响应是 Invalid mime type "XML;charset=ISO-8859-1": does not contain '/'。

谁能帮帮我。

【问题讨论】:

  • XML 输出不是格式良好的 XML。它缺少一个关闭文档元素
  • 我编辑了这个问题。我发布问题的错误
  • 如果将内容类型标头显式设置为字符串值而不是 setContentType 是否有效? headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE);
  • @codebrane:不,那么它也不起作用

标签: spring spring-boot rest


【解决方案1】:

首先,mime 类型始终具有视图 type/subtype

我看到你使用 Spring 的 HttpHeadersMediaType。看起来类 MediaType 不是来自 Spring 的包,请检查这个。可能,在您“错误”的导入类 MimeType 中,MediaType.APPLICATION_XML 的值不是 application/xml 而是 XML

您可以通过设置值application/xml来手动检查。

第二个观察:如果您的标头已经有 ACCEPT 标头,它将添加(将至少 2 个 ACCEPT 标头)。如果您想使用一个标头,请使用.set 而不是.add

【讨论】:

  • MediaType 来自 Springs 包。我什至尝试只使用.set。还是不行
  • 所以,提供更多信息。我看不到您如何将标头设置为请求。是否按要求完成:request = new HttpEntity(dto_in_string_format, headers);?)
  • 是的,我将标头设置为 Request,如下所示: HttpEntity request = new HttpEntity(requestbody,getHeaders());其中 getHeaders 设置所有请求标头,例如:HttpHeaders headers = new HttpHeaders(); headers.add()
  • 问题最终得到解决。 RestTemplate 抛出错误,因为它总是期望响应头类型中的“/”。我只为这个功能使用了另一个 http 客户端,它成功了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多