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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With