este é o meu javascript:
function getWeather() {
$.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
alert('Success');
});
}
este é meu controlador:
@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 />
Obtendo este erro:
GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)
Cabeçalhos:
Cabeçalhos de resposta
Server Apache-Coyote/1.1
Content-Type text/html;charset=utf-8
Content-Length 1070
Date Sun, 18 Sep 2011 17:00:35 GMT
Solicitar cabeçalhos
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
Interesting note:
I get 406 error, but the hibernate query works meanwhile. This is what tomcat log says, everytime when I change selection in dropbox:
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=?
What could the problem be? There were two similar questions in SO before, I tried all the accepted hints there, but they did not work I guess...
Any suggestions? Feel free to ask questions...
mvc
there? I used<tx:annotation-driven />
and tx isxmlns:tx="http://www.springframework.org/schema/tx"
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
and spring-web-3.0.x and spring-webmvc-3.0.x jars?tx:annotation-driven
is same asmvc:annotation-drive
or smthin.I had same issue, with Latest Spring 4.1.1 onwards you need to add following jars to 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>
also make sure you have following 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>
406 Spring MVC Json, not acceptable according to the request "accept" headers
fonte
MappingJacksonHttpMessageConverter
for Jackson 1 andMappingJackson2HttpMessageConverter
for Jackson 2. Each of these is good enough to serialize/deserializing JSON. You only need one (go with Jackson 2 since it's more feature rich).There is another case where this status will be returned: if the Jackson mapper cannot figure out how to serialize your bean. For example, if you have two accessor methods for the same boolean property,
isFoo()
andgetFoo()
.What's happening is that Spring's MappingJackson2HttpMessageConverter calls Jackson's StdSerializerProvider to see if it can convert your object. At the bottom of the call chain,
StdSerializerProvider._createAndCacheUntypedSerializer
throws aJsonMappingException
with an informative message. However, this exception is swallowed byStdSerializerProvider._createAndCacheUntypedSerializer
, which tells Spring that it can't convert the object. Having run out of converters, Spring reports that it's not being given anAccept
header that it can use, which of course is bogus when you're giving it*/*
.There is a bug for this behavior, but it was closed as "cannot reproduce": the method that's being called doesn't declare that it can throw, so swallowing exceptions is apparently an appropriate solution (yes, that was sarcasm). Unfortunately, Jackson doesn't have any logging ... and there are a lot of comments in the codebase wishing it did, so I suspect this isn't the only hidden gotcha.
fonte
I had the same problem, my controller method executes but response is Error 406. I debug
AbstractMessageConverterMethodProcessor#writeWithMessageConverters
and found that methodContentNegotiationManager#resolveMediaTypes
always returnstext/html
which is not supported byMappingJacksonHttpMessageConverter
. The problem is that theorg.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy
works earlier thanorg.springframework.web.accept.HeaderContentNegotiationStrategy
, and extension of my request/get-clients.html
is the cause of my problem with Error 406. I just changed request url to/get-clients
.fonte
Make sure that following 2
jar
's are present in class path.If any one or both are missing then this error will come.
jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar
fonte
Finally found answer from here:
Mapping restful ajax requests to spring
I quote:
fonte
Check
<mvc:annotation-driven />
in dispatcherservlet.xml , if not add it. And add<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>
these dependencies in your pom.xml
fonte
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-base</artifactId> <version>2.6.3</version> </dependency>
fonte
Probably no one is scrolling down this far, but none of the above solutions fixed it for me, but making all my getter methods
public
did.I'd left my getter visibility at package-private; Jackson decided it couldn't find them and blew up. (Using
@JsonAutoDetect(getterVisibility=NON_PRIVATE)
only partially fixed it.fonte
AbstractMap.SimpleImmutableEntry
then downgraded toAbstractMap.SimpleEntry
, still no dice as it doesn't have a setter for the key. Gone pojo on this.Make sure that the sent object (Weather in this case) contains getter/setter
fonte
In the controller, shouldn't the response body annotation be on the return type and not the method, like so :
@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET) public @ResponseBody Weather getTemparature(@PathVariable("id") Integer id){ Weather weather = weatherService.getCurrentWeather(id); return weather; }
I'd also use the raw jquery.ajax function, and make sure contentType and dataType are being set correctly.
On a different note, I find the spring handling of json rather problematic. It was easier when I did it all myself using strings, and GSON.
fonte
@ResponseBody
should not matter... I will look into GSON...but still would like this JSON to work if possible.As @atott mentioned.
If you have added the latest version of Jackson in your pom.xml, and with Spring 4.0 or newer, using
@ResponseBody
on your action method and@RequestMapping
configured withproduces="application/json;charset=utf-8"
, however, you still got 406(Not Acceptable), I guess you need to try this in your MVC DispatcherServlet context configuration:<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="false" /> </bean>
That's the way how I resolved my issue finally.
fonte
Spring 4.3.10: I used the below settings to resolve the issue.
Step 1: Add the below dependencies
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.6.7</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.7</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>
Step 2: Add the below in your MVC DispatcherServlet context configuration:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="false"/> <property name="favorParameter" value="true"/> <property name="ignoreAcceptHeader" value="false" /> </bean>
Since spring 3.2, as per the default configuration favorPathExtension is set as true, because of this if the request uri have any proper extensions like
.htm
spring will give priority for the extension. In step 2 I had added the contentNegotiationManager bean to override this.fonte
I was having the same problem because I was missing the @EnableWebMvc annotation. (All of my spring configurations are annotation-based, the XML equivalent would be mvc:annotation-driven)
fonte
make sure your have correct jackson version in your classpath
fonte
WEB-INF/lib
folder, but still same problem :/Check as @joyfun did for the correct version of jackson but also check our headers ... Accept / may not be transmitted by the client ... use firebug or equivalent to check what your get request is actually sending. I think the headers attribute of the annotation /may/ be checking literals although I'm not 100% sure.
fonte
Other then the obvious problems I had another one that I couldn't fix regardless of including all possible JARs, dependancies and annotations in Spring servlet. Eventually I found that I have wrong file extension by that I mean I had two separate servlet running in same container and I needed to map to different file extensions where one was ".do" and the other as used for subscriptions was randomly named ".sub". All good but SUB is valid file extension normally used for films subtitle files and thus Tomcat was overriding the header and returning something like "text/x-dvd.sub..." so all was fine but the application was expecting JSON but getting Subtitles thus all I had to do is change the mapping in my
web.xml
file I've added:<mime-mapping> <extension>sub</extension> <mime-type>application/json</mime-type> </mime-mapping>
fonte
I had the same problem unfortunately non of the solution here solved my problem as my problem was something in a different class.
I first checked that all dependencies are in place as suggested by @bekur then I checked the request/response that travels from clients to the server all headers was in place an properly set by Jquery. I then checked the
RequestMappingHandlerAdapter
MessageConverters
and all 7 of them were in place, I really started to hate Spring ! I then updated to from Spring4.0.6.RELEASE
to4.2.0.RELEASE
I have got another response rather than the above. It wasRequest processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type
Here is my controller method
@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; } }
The solution was to make UploadPictureResult not to extend WebResponse
For some reason spring was not able to determine the how to convert UploadPictureReslt when it extended WebResponse
fonte
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.0</version> </dependency>
i don't use ssl authentication and this jackson-databind contain jackson-core.jar and jackson-databind.jar, and then change the RequestMapping content like this:
@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; }
attention: if your produces is not "application/json" type and i had not noticed this and got an 406 error, help this can help you out.
fonte
check this thread. spring mvc restcontroller return json string p/s: you should add jack son mapping config to your WebMvcConfig class
fonte
This is update answer for springVersion=5.0.3.RELEASE.
Those above answers will be only worked older springVersion < 4.1 version. for latest spring you have to add following dependencies in gradle file:
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: fasterxmljackson compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: fasterxmljackson fasterxmljackson=2.9.4
I hope this will be helpful for who using latest spring version.
fonte
Can you remove the headers element in @RequestMapping and try..
Like
@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)
I guess spring does an 'contains check' rather than exact match for accept headers. But still, worth a try to remove the headers element and check.
fonte
weatherService.getCurrentWeather(id);
"activated"...so something works...is it possible that 406 appears and Hibernate SQL select works in the same time?