根据请求具有不可接受的特征的响应"接受"标头 - HTTP状态406 - spring-boot

时间:2016-08-10 13:16:53

标签: spring-boot

  

任何以50美元解决此问题的人,请联系

我根据要求得到了不可接受的"接受"但是,我相信我做的一切都是正确的,我可以。有人可以帮助解决此问题。我使用的是Spring 4.1。

目标是能够以 text / xml 格式返回响应。如果我删除produce = text / xml指令然后我的应用程序工作,即没有错误,但源系统以意外的方式处理响应。

请求如下: curl -X POST -H"内容类型:application / x-www-form-urlencoded" -H"授权:基本YWRtaW46YWRtaW4 =" -H"缓存控制:无缓存" -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>

enter image description here

我的控制器有以下注释:

@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 INFO 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] cffnocc.injestor.MyController:从ipAddress收到的请求:0:0:0:0:0:0:0: 1 2016-08-11 13:38:04.082 INFO 89535 --- [nio-8080-exec-2] c.f.fnocc.injestor.MyController:REQUEST INFORMATION:[ 2016-08-11 13:38:04.084 INFO 89535 --- [nio-8080-exec-2] scaAnnotationConfigApplicationContext:刷新org.springframework.context.annotation.AnnotationConfigApplicationContext@af3b571:启动日期[Thu Aug 11 13:38: 04 BST 2016];上下文层次结构的根 2016-08-11 13:38:04.095 INFO 89535 --- [nio-8080-exec-2] f.a.AutowiredAnnotationBeanPostProcessor:JSR-330&#39; javax.inject.Inject&#39;找到并支持自动装配的注释 2016-08-11 13:38:04.119 INFO 89535 --- [nio-8080-exec-2] scaAnnotationConfigApplicationContext:刷新org.springframework.context.annotation.AnnotationConfigApplicationContext@142abfa2:启动日期[Thu Aug 11 13:38: 04 BST 2016];上下文层次结构的根 2016-08-11 13:38:04.124 INFO 89535 --- [nio-8080-exec-2] f.a.AutowiredAnnotationBeanPostProcessor:JSR-330&#39; javax.inject.Inject&#39;找到并支持自动装配的注释 2016-08-11 13:38:04.150 ERROR 89535 --- [nio-8080-exec-2] c.f.fnocc.injestor.MyController:发生错误。

1 个答案:

答案 0 :(得分:0)

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

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

*更新* 我在用于解释consumes标头而不是Content-Type标头的Accept上出错了。 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 * 能够重现错误。为DEBUG添加org.springframework.web日志记录级别可以更清楚地显示问题。

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>

使其适用于我的示例应用程序。试一试!