【问题标题】:Spring Server Error on unknown Accept header未知 Accept 标头上的 Spring Server 错误
【发布时间】:2019-03-14 03:41:09
【问题描述】:

我有一个使用 Spring Boot 的 Spring REST 项目。我已经将 jackson-dataformat-xml 声明为 maven 中的依赖项,以在接受标头为 application/xml(并且它本机接受 application/json)时支持 xml。

我遇到的问题是,当我将接受标头设置为这两个以外的任何内容时(例如 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

关于如何修复的任何想法,以便我可以忽略接受标头并返回 json 或告诉客户端这是一个错误的请求?

【问题讨论】:

    标签: spring content-negotiation


    【解决方案1】:
    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";
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多