Spring JSON请求获得406(不可接受)

这是我的javascript:

function getWeather() { $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) { alert('Success'); }); } 

这是我的控制器:

 @RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET) @ResponseBody public Weather getTemparature(@PathVariable("id") Integer id){ Weather weather = weatherService.getCurrentWeather(id); return weather; } 

为spring-servlet.xml

 <context:annotation-config /> <tx:annotation-driven /> 

得到这个错误:

 GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable) 

头:

响应头

 Server Apache-Coyote/1.1 Content-Type text/html;charset=utf-8 Content-Length 1070 Date Sun, 18 Sep 2011 17:00:35 GMT 

请求头

 Host localhost:8080 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 Accept application/json, text/javascript, */*; q=0.01 Accept-Language en-us,en;q=0.5 Accept-Encoding gzip, deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection keep-alive X-Requested-With XMLHttpRequest Referer http://localhost:8080/web/weather Cookie JSESSIONID=7D27FAC18050ED84B58DAFB0A51CB7E4 

有趣的说明:

我得到了406错误,但hibernate查询同时工作。 这就是tomcat日志所说的,每当我改变dropbox的select:

  select weather0_.ID as ID0_0_, weather0_.CITY_ID as CITY2_0_0_, weather0_.DATE as DATE0_0_, weather0_.TEMP as TEMP0_0_ from WEATHER weather0_ where weather0_.ID=? 

问题是什么? 在之前有两个类似的问题,我尝试了所有的接受提示,但他们没有工作,我猜…

有什么build议么? 随意问的问题…

406不可接受

由请求标识的资源只能根据在请求中发送的接受头来生成具有不可接受的内容特征的响应实体。

所以,你的请求接受头是应用程序/ JSON和你的控制器无法返回。 这发生在正确的HTTPMessageConverter不能满足@ResponseBody注释返回值时。 在使用<mvc:annotation-driven> ,HTTPMessageConverter会自动注册,在类path中给定某些三维方库。

要么你的类path中没有正确的Jackson库,要么你没有使用<mvc:annotation-driven>指令。

我成功地复制了你的场景,它使用这两个库工作得很好,没有headers="Accept=*/*"指令。

  • jackson核心ASL-1.7.4.jar
  • jackson映射器-ASL-1.7.4.jar

我有同样的问题,与最新的spring4.1.1起,你需要添加以下jar到pom.xml。

 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.1.1</version> </dependency> 

也请确保你有以下的jar:

 <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> 

JSON Spring MVC,根据请求“接受”头文件不能接受

还有另外一种情况是返回这个状态:如果jackson映射器无法弄清楚如何序列化你的bean。 例如,如果对同一个boolean属性isFoo()getFoo()有两个访问方法。

发生了什么事是Spring的MappingJackson2HttpMessageConverter调用了Jackson的StdSerializerProvider ,看它是否可以转换你的对象。 在调用链的底部, StdSerializerProvider._createAndCacheUntypedSerializer抛出一个带有提示信息的JsonMappingException 。 但是,这个exception被StdSerializerProvider._createAndCacheUntypedSerializer吞噬,它告诉Spring它不能转换对象。 在转换器用完之后,Spring报告说没有给它一个可以使用的Accept头,当你给它的时候这当然是假的*/*

这种行为有一个错误 ,但是它被封闭为“不能重现”:被调用的方法没有声明它可以抛出,所以吞咽exception显然是一个合适的解决scheme(是的,这是讽刺)。 不幸的是,jackson没有任何日志logging…在代码库中有很多意见,希望这样做,所以我怀疑这不是唯一隐藏的陷阱。

我有同样的问题,我的控制器方法执行,但响应是错误406.我debuggingAbstractMessageConverterMethodProcessor#writeWithMessageConverters ,发现方法ContentNegotiationManager#resolveMediaTypes总是返回不支持MappingJacksonHttpMessageConverter text/html 。 问题是, org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategyorg.springframework.web.accept.HeaderContentNegotiationStrategy早,我的请求/get-clients.html扩展是我的问题与错误406的原因。我只是将请求url更改为/get-clients

确保在课程path中存在以下2个jar

如果有一个或两个都失踪了,那么这个错误就会出现。

 jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar 

最后从这里find答案:

映射宁静的Ajax请求到spring

我引用:

@ RequestBody / @ ResponseBody注解不使用普通的视图parsing器,它们使用自己的HttpMessageConverters。 为了使用这些注释,您应该在AnnotationMethodHandlerAdapter中configuration这些转换器,如引用中所述(您可能需要MappingJacksonHttpMessageConverter)。

 <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-base</artifactId> <version>2.6.3</version> </dependency> 

我有同样的问题,因为我错过了@EnableMvc注释。 (我所有的springconfiguration都是基于注释的,XML的等价物是mvc:annotation-driven)

确保你的classpath里有正确的jackson版本

检查@joyfun做了正确版本的jackson,但也检查我们的头…接受/可能不会传输的客户端…使用萤火虫或相当于检查你的请求是实际发送。 我认为注释的标题属性可能会检查文字,虽然我不是100%确定。

在控制器中,响应体注释不应该是返回types而不是方法,如下所示:

 @RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET) public @ResponseBody Weather getTemparature(@PathVariable("id") Integer id){ Weather weather = weatherService.getCurrentWeather(id); return weather; } 

我也使用原始jquery.ajax函数,并确保contentType和dataType正确设置。

另一方面,我发现json的spring处理相当麻烦。 当我自己使用string和GSON完成时,它会更容易。

除此之外,还有另一个我不能解决的问题,包括Spring servlet中的所有可能的JAR,依赖和注释。 最终我发现我有错误的文件扩展名,我的意思是我有两个单独的servlet运行在同一个容器中,我需要映射到不同的文件扩展名,其中一个是“.do”,另一个用于订阅被随机命名为“。子”。 所有好的,但SUB是有效的文件扩展名通常用于电影字幕文件,因此,Tomcat重写头文件,并返回像“text / x-dvd.sub …”这样的一切都很好,但应用程序期待JSON,但得到字幕因此,我所要做的就是改变我添加的web.xml文件中的映射:

 <mime-mapping> <extension>sub</extension> <mime-type>application/json</mime-type> </mime-mapping> 

我有同样的问题不幸的解决scheme这里解决了我的问题,因为我的问题是在不同的类中的东西。

我首先检查了@bekurbuild议的所有依赖关系,然后我检查了从客户端到服务器的请求/响应,所有头文件都由Jquery正确设置。 然后我检查了RequestMappingHandlerAdapter MessageConverters ,其中的7个都已经到位,我真的开始讨厌Spring了! 我然后更新到从Spring 4.0.6.RELEASE4.2.0.RELEASE我有另一个回应,而不是上述。 这是Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type

这是我的控制器方法

  @RequestMapping(value = "/upload", method = RequestMethod.POST,produces = "application/json") public ResponseEntity<UploadPictureResult> pictureUpload(FirewalledRequest initialRequest) { DefaultMultipartHttpServletRequest request = (DefaultMultipartHttpServletRequest) initialRequest.getRequest(); try { Iterator<String> iterator = request.getFileNames(); while (iterator.hasNext()) { MultipartFile file = request.getFile(iterator.next()); session.save(toImage(file)); } } catch (Exception e) { return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(),HttpStatus.INTERNAL_SERVER_ERROR); } return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(), HttpStatus.OK); } public class UploadPictureResult extends WebResponse{ private List<Image> images; public void setImages(List<Image> images) { this.images = images; } } public class WebResponse implements Serializable { protected String message; public WebResponse() { } public WebResponse(String message) { this.message = message; } public void setMessage(String message) { this.message = message; } } 

解决scheme是使UploadPictureResult不扩展WebResponse

由于某些原因,Spring在扩展WebResponse时无法确定如何转换UploadPictureReslt

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

我不使用ssl身份validation,并且这个jackson-databind包含jackson-core.jar和jackson-databind.jar,然后像这样更改RequestMapping内容:

 @RequestMapping(value = "/id/{number}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET) public @ResponseBody Customer findCustomer(@PathVariable int number){ Customer result = customerService.findById(number); return result; } 

注意:如果你的产品不是“application / json”types,我没有注意到这个,并得到了一个406错误,帮助这可以帮助你。

正如@atott所提到的 。

如果你已经在你的pom.xml中添加了最新版本的Jackson,并且在你的action方法中使用了@ResponseBody在使用@ResponseBody produces="application/json;charset=utf-8"configuration的@RequestMapping使用了Spring 4.0或更新版本,你仍然有406(不可接受),我想你需要在你的MVC DispatcherServlet上下文configuration中试试这个:

 <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="false" /> </bean> 

这就是我最终解决问题的方法。

检查这个线程。 springmvc restcontroller返回JSONstring P / S:你应该添加杰克儿子映射configuration到您的WebMvcConfig类

@Override protected void configureMessageConverters( List<HttpMessageConverter<?>> converters) { // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON converters.add(new MappingJackson2HttpMessageConverter()); // and probably needs a string converter too for text/plain content-type strings to be properly handled converters.add(new StringHttpMessageConverter()); }

你可以删除@RequestMapping中的标题元素,并尝试..

喜欢

@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)
@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET) 

我想spring做一个“包含检查”,而不是完全匹配的接受头。 但是,仍然值得尝试删除标题元素,并检查。