org.springframework.http.InvalidMediaTypeException: Недопустимый mime-тип «XML;charset=ISO-8859-1»: не содержит ‘/’

#spring #spring-boot #rest

#весна #spring-boot #rest

Вопрос:

Я создаю REST API с помощью SpringBoot (API1). который вызывает другой Rest API с использованием RestTemplate(API2). API2, который я вызываю, требует ввода xml и выдает вывод xml.

Вывод XML, который API 2 отправляет обратно, имеет структуру, подобную приведенной ниже

     <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-адреса — это API2, который я вызываю.

При выполнении RestTemplate.exchange я получаю код состояния, если 200 Ok, вместе с ошибкой Недопустимый mime-тип «XML; charset = ISO-8859-1»: не содержит ‘/’ . Когда я отлаживал код.Я обнаружил, что это выдается responseExtractor.extractData(ответ) в пакете org.springframework.web.client; и метод 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, возникает при выполнении моего потока, но ответ, который я получаю, является недопустимым mime-типом «XML; charset = ISO-8859-1»: не содержит ‘/’.

Кто-нибудь может мне помочь, пожалуйста.

Комментарии:

1. вывод XML не является правильно сформированным XML. В нем отсутствует закрывающий элемент документа </xml>

2. Я отредактировал вопрос. Моя ошибка в публикации вопроса

3. работает ли это, если вы явно задаете заголовку content-type значение string вместо setContentType? заголовки.добавить(HttpHeaders. CONTENT_TYPE, MediaType. APPLICATION_XML_VALUE);

4. @codebrane: Нет, тогда тоже не работает

Ответ №1:

Во-первых, mime-тип всегда имеет представление type/subtype .

Я вижу, вы используете Spring HttpHeaders и MediaType . Похоже, класс MediaType не из пакета Spring, проверьте это. Возможно, в «неправильном» импортированном классе MimeType значение MediaType.APPLICATION_XML не application/xml равно, но XML .

Вы можете проверить это вручную, установив значение application/xml .

2-е наблюдение: если в ваших заголовках уже есть заголовок ACCEPT, он будет добавлен (будет не менее 2 заголовков ACCEPT). Если вы хотите использовать один заголовок, используйте .set вместо .add него .

Комментарии:

1. Тип среды из пакета Springs. Я пытался даже использовать only .set. Все еще не работает

2. Итак, предоставьте дополнительную информацию. Я не понимаю, как вы устанавливаете заголовки в запрос. Выполняется ли это как требуется: request = new HttpEntity<>(dto_in_string_format, заголовки);?)

3. да, я устанавливаю заголовки в запрос следующим образом: HttpEntity<> request = new HttpEntity<>(requestbody,getHeaders()); где getHeaders устанавливает все заголовки запроса следующим образом: HttpHeaders headers = new HttpHeaders(); headers.add()

4. Проблема окончательно решена. Ошибка выдается RestTemplate, поскольку он всегда ожидает «/» в типе заголовка ответа. Я использовал другой http-клиент только для этой функции, и это сработало