I'm working on a Spring MVC project and one of the tasks I need to do requires me to have a string of JSON data sent through by the user in a POST request. I know that Spring will deserialize JSON using Jackson to objects, but if I try something like the following:
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void doSomething(@RequestBody String json) {
// do something
}
I simply get HTTP 400 Bad Request back ("The request sent by the client was syntactically incorrect.").
How can I get the raw JSON sent by the client as a string?
In my case is because the json has not quoted the field names. An example, this is not accepted:
but this one yes:
I haven't found yet how I can configure object mapping in spring context. I know there is a JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES but I don't know how set that for object mapper.
if your Content-type is "application/json" and your first messageConvertor is not org.springframework.http.converter.StringHttpMessageConverter , Spring could not work right. In my case , I did this:
We had a situation where we wanted some controller methods to map the POST body to beans, and other methods where we just wanted the raw String. To accomplish this using the
@RequestBody
annotation, you need to configure multiple message converters, something like...Then, requests to the various methods must specify the "content-type" header with an appropriate value. For those methods where the request body is mapped to a JAXB bean, specify "
application/xml
". And for those where the request body is a String, use "text/plain
".You could try avoiding
@RequestBody
altogether and instead grab the request body directly through aInputStream
/Reader
or aWebRequest
/HttpServletRequest
.You will usually see this type of error when Spring MVC finds a request mapping that matches the URL path but the parameters (or headers or something) don't match what the handler method is expecting.
If you use the @RequestBody annotation then I believe Spring MVC is expecting to map the entire body of the POST request to an Object. I'm guessing your body is not simply a String, but some full JSON object.
If you have a java model of the JSON object you are expecting then you could replace the String parameter with that in your doSomething declaration, such as
public void doSomething(@RequestBody MyObject myobj) {
If you don't have a Java object that matches the JSON then you could try to get it working by replacing the
String
type with aMap<String, Object>
and see if that gets you closer to a working solution.You could also turn on debug logging in Spring MVC to get more information on why it was a bad request.
Edit: Given your requirements in the comments, you could simply inject the HttpServletRequest into your method and read the body yourself.
For me with spring version update it was simply an " necessary now. "XXX" instead of XXX and everything is working fine as you have it. Content-Type application/json