Issue
Below is my controller method definition
@Autowired
private HttpServletRequest request;
@PostMapping(path = "/abc")
public String createAbc(@RequestBody HttpServletRequest request)
throws IOException {
logger.info("Request body: "+request.getInputStream());
return "abc";
}
All i want to do is print contents to request body. But when i make a POST request i see below error:
Type definition error: [simple type, class javax.servlet.http.HttpServletRequest]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
javax.servlet.http.HttpServletRequest
(no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: (PushbackInputStream); line: 1, column: 2]",
I'm using Spring boot 2.x version.Any idea what's wrong in my code?
Solution
First, remove the @Autowired
field. It's wrong and you're not using it anyway.
Now you have two choices:
Let Spring process the request body for you, by using the
@RequestBody
annotation:@PostMapping(path = "/abc") public String createAbc(@RequestBody String requestBody) throws IOException { logger.info("Request body: " + requestBody); return "abc"; }
Process it yourself, i.e. don't use the
@RequestBody
annotation:@PostMapping(path = "/abc") public String createAbc(HttpServletRequest request) throws IOException { StringBuilder builder = new StringBuilder(); try (BufferedReader in = request.getReader()) { char[] buf = new char[4096]; for (int len; (len = in.read(buf)) > 0; ) builder.append(buf, 0, len); } String requestBody = builder.toString(); logger.info("Request body: " + requestBody); return "abc"; }
Don't know why you'd use option 2, but you can if you want.
Answered By - Andreas
Answer Checked By - David Marino (JavaFixing Volunteer)