【问题标题】:Responses with characteristics not acceptable according to the request "accept" headers - HTTP Status 406 - spring-boot根据请求“接受”标头的特征不可接受的响应 - HTTP 状态 406 - spring-boot
【发布时间】:2016-08-10 13:16:53
【问题描述】:

任何需要 50 美元解决此问题的接受者,请联系

根据请求“接受”标头,我得到了不可接受的结果,但是,我相信我做的一切都是正确的,我可以。有人可以帮助解决这个问题。我正在使用 Spring 4.1。

OBJECTIVE 是为了能够以 text/xml 格式返回响应。如果我删除了produces=text/xml 指令,那么我的应用程序可以正常工作,即没有错误,但是源系统会以一种意想不到的方式处理响应。

请求如下: curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Cache-Control: no-cache" -H "Postman-Token: 78637a4f- e153-4242-c922-96757d01442a" -d 然后值....

我的 Pom:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.0.rc1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.0.rc1</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

我的控制器有以下符号:

@RestController
@RequestMapping("/test")
@EnableWebMvcMy Controller has the following notations:

主类有以下符号 @配置 @EnableAutoConfiguration @ComponentScan

我没有应用程序上下文 xml,因为我正在使用 @Autowired 我的端点方法如下

@RequestMapping(value="/IDEA",  headers = {"Accept=*/*"}, produces="text/xml",    method= {RequestMethod.POST, RequestMethod.GET})
@Autowired
public MyResult processMyRequest(HttpServletRequest request) 

当前日志

2016-08-11 13:38:04.076 信息 89535 --- [nio-8080-exec-2] c.f.fnocc.injestor.MyController : POST CALLED 2016-08-11 13:38:04.079 INFO 89535 --- [nio-8080-exec-2] c.f.fnocc.injestor.MyController:从 ipAddress:0:0:0:0:0:0:0 收到的请求: 1 2016-08-11 13:38:04.082 信息 89535 --- [nio-8080-exec-2] c.f.fnocc.injestor.MyController:请求信息:[ 2016-08-11 13:38:04.084 INFO 89535 --- [nio-8080-exec-2] s.c.a.AnnotationConfigApplicationContext:刷新 org.springframework.context.annotation.AnnotationConfigApplicationContext@af3b571:启动日期 [8 月 11 日星期四 13:38: 04 BST 2016];上下文层次的根 2016-08-11 13:38:04.095 INFO 89535 --- [nio-8080-exec-2] f.a.AutowiredAnnotationBeanPostProcessor:发现并支持自动装配 JSR-330 'javax.inject.Inject' 注释 2016-08-11 13:38:04.119 INFO 89535 --- [nio-8080-exec-2] s.c.a.AnnotationConfigApplicationContext:刷新 org.springframework.context.annotation.AnnotationConfigApplicationContext@142abfa2:启动日期 [8 月 11 日星期四 13:38: 04 BST 2016];上下文层次的根 2016-08-11 13:38:04.124 INFO 89535 --- [nio-8080-exec-2] f.a.AutowiredAnnotationBeanPostProcessor:发现 JSR-330 'javax.inject.Inject' 注释并支持自动装配 2016-08-11 13:38:04.150 错误 89535 --- [nio-8080-exec-2] c.f.fnocc.injestor.MyController:发生错误。

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    我看到的第一个问题是 @EnableWebMvc 应该在主类中与 @Configuration 一起指定,但我认为在指定 @EnableAutoConfiguration 时甚至不需要它。

    另一个问题是@RequestMapping() 具有consumes 的属性,您可能应该使用它而不是寻找接受标头。原因是接受标头通常包括多种媒体类型,而不仅仅是*/*,因此该标头上的相等性检查将不存在。

    * 更新 * 我在用于解释 Content-Type 标头而不是 Accept 标头的 consumes 上错了。 Spring 尝试将producesAccept 标头匹配,以确定该方法是否可以响应传入的请求。这更能说明为什么您会收到 406 错误,因为 Spring 看到方法试图输出 text/xml 但请求可能不接受 Accept 标头中的内容类型。

    要进一步排除故障,您可以设置一个请求记录器以查看有关请求如何进入服务的详细信息,以确定是否存在导致 Spring 无法正确处理它的问题。如果添加以下 bean 并在org.springframework.web.filter.CommonsRequestLoggingFilter 上启用 DEBUG 级别日志记录,则可以看到。

    @Bean
    public Filter logFilter() {
        CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
        filter.setIncludeQueryString(false);
        filter.setIncludePayload(false);
        filter.setIncludeHeaders(true);
        return filter;
    }
    

    如果您可以使用该请求日志更新您的问题,这将有助于解决问题。

    * 更新 #2 * 能够重现错误。为org.springframework.web 添加DEBUG 日志记录级别更清楚地显示了问题。

    2016-08-11 02:26:58.242 DEBUG 82904 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/test/IDEA]
    2016-08-11 02:26:58.244 DEBUG 82904 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /test/IDEA
    2016-08-11 02:26:58.247 DEBUG 82904 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public ca.tuatara.stackoverflow.MyController$MyResult ca.tuatara.stackoverflow.MyController.processMyRequest(javax.servlet.http.HttpServletRequest)]
    2016-08-11 02:26:58.247 DEBUG 82904 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/test/IDEA] is: -1
    2016-08-11 02:26:58.258 DEBUG 82904 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public ca.tuatara.stackoverflow.MyController$MyResult ca.tuatara.stackoverflow.MyController.processMyRequest(javax.servlet.http.HttpServletRequest)]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    

    Could not find acceptable representation 是关键。通过指定您需要 XML,您必须包含一个库来将对象编组为 XML,如 Spring MVC 文档中所述。添加依赖项:

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
    

    使它适用于我的示例应用程序。试试看吧!

    【讨论】:

    • 嗨,肖恩,非常感谢您的回复。在@RequestMapping 中引入produce="text/xml" 后,我开始收到406 错误,我需要它,因为源系统需要text/xml 格式的响应。因此,如果有人可以帮助我在 text/xml 中强制响应,那就太好了。
    • 请求:curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Cache-Control: no-cache " -H "Postman-Token: 78637a4f-e153-4242-c922-96757d01442a" -d Then values.... 响应:此请求标识的资源只能生成具有根据请求不可接受的特征的响应"接受" 标头。

      Apache Tomcat/7.0.52

    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2015-11-06
    • 2019-04-30
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多