Spring Server Ошибка в неизвестном заголовке Accept - PullRequest
0 голосов
/ 14 марта 2019

У меня есть проект Spring REST, который использует весеннюю загрузку.Я объявил jackson-dataformat-xml зависимостью в maven для поддержки xml, когда заголовок accept равен application / xml (и он изначально принимает application / json).

Проблема, с которой я сталкиваюсь, - когда я устанавливаю acceptзаголовок к чему-либо, кроме этих двух (например, application / dsfas или text / html, я получаю ошибку сервера со следующим исключением:

23:36:04.368 [http-nio-8082-exec-5] WARN  o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failure in @ExceptionHandler protected org.springframework.http.ResponseEntity<java.lang.Object> com.mergg.common.web.RestResponseEntityExceptionHandler.handleNotFound(java.lang.RuntimeException,org.springframework.web.context.request.WebRequest)
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Любая идея о том, как исправить, чтобы я мог либо проигнорировать команду acceptзаголовок и вернуть JSON или сказать клиенту, что это был неправильный запрос?

1 Ответ

1 голос
/ 14 марта 2019
public class JsonContentNegotiation implements ContentNegotiationStrategy {

@Override
public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest) throws HttpMediaTypeNotAcceptableException {
    System.out.println("This is your negotation Strategy");
    HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
    String headers = request.getHeader(HttpHeaders.ACCEPT);
    List<MediaType> mediaTypes = MediaType.parseMediaTypes(headers);
    if(headers.indexOf(MediaType.APPLICATION_JSON_VALUE)==-1){
        mediaTypes.add(new MediaType("application","json"));
    }
    MediaType.sortBySpecificityAndQuality(mediaTypes);
    return mediaTypes;

}

}

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true"/>
<property name="ignoreAcceptHeader" value="true"/>
<property name="defaultContentTypeStrategy">
  <bean class="demo2.ContentNegotation.JsonContentNegotiation"/>
</property>

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>

в противном случае используйте это в контроллере, чтобы сообщить клиенту, что это неправильный заголовок

@ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
@ResponseBody
public String fix(Exception e){
    System.out.println("do This");
    return "Accept Header may be wrong";
}
...