今天在使用Spring Template
的时候遇到了这个异常:
no suitable HttpMessageConverter found for request type [java.lang.Integer]
Google了一下然后在stackoverflow上面找到了解决方案:
I have a method in Spring rest service.
@RequestMapping(value = "test/process", method = RequestMethod.POST) public @ResponseBody MyResponse processRequest(String RequestId, int count)
I am using Spring RestTemplate to call this service like this.
RestTemplate restTemplate = this.getRestTemplate(); MultiValueMapmap = new LinkedMultiValueMap (); map.add("RequestId", RequestId); map.add("count", count); restTemplate.postForObject(url, map,MyResponse.class);
When I try to invoke the client method I get the exception that no suitable HttpMessageConverter found for request type [java.lang.Integer]
org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [java.lang.Integer]at org.springframework.http.converter.FormHttpMessageConverter.writePart(FormHttpMessageConverter.java:310)at org.springframework.http.converter.FormHttpMessageConverter.writeParts(FormHttpMessageConverter.java:270)at org.springframework.http.converter.FormHttpMessageConverter.writeMultipart(FormHttpMessageConverter.java:260)at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:200)at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:1)at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:596)
I know one of the ways is to pass all the parameters as String. But I might need to pass complex data types as parameters later. What is the ways to achieve this. I have googled and some option seem to be writing my own converters. How should I start about solving this problem.
解决办法
The root cause of this error is that by specifying an Integer
in the LinkedMultiValueMap
, the RestTemplate
will take that to mean that your request is a multipart request. There is no HttpMessageConverter
registered by default that can handle writing values of type Integer to a request body.
As you said, you can handle this situation by changing the count
to be a String
. After all, there is no Integer
type in HTTP request parameters. However, you were worried
But I might need to pass complex data types as parameters later.
Assume something like this
public @ResponseBody MyResponse processRequest(String RequestId, int count, Complex complex)
with
public class Complex { private String someValue; private int intValue; public String getSomeValue() { return someValue; } public void setSomeValue(String someValue) { this.someValue = someValue; } public int getIntValue() { return intValue; } public void setIntValue(int intValue) { this.intValue = intValue; } public String toString() { return someValue + " " + intValue; }}
The the following will work just fine
MultiValueMapmap = new LinkedMultiValueMap ();map.add("RequestId", "asd");map.add("count", "42");map.add("someValue", "complex");map.add("intValue", "69");restTemplate.postForObject(url, map,MyResponse.class);
Remember that the request parameters are used to populate the fields of model attributes by their names.
An even better solution would have you using a serialization standard like JSON or XML.I mean instead of sending request parameters, you should send JSON and XML. Spring supports those types with @RequestBody annotation on handler method parameters.