我正在尝试使用Spring的RestTemplate功能发送POST请求,但是在发送对象时遇到了问题。这是我用来发送请求的代码:
RestTemplate rt = new RestTemplate();
MultiValueMap<String,Object> parameters = new LinkedMultiValueMap<String,Object>();
parameters.add("username", usernameObj);
parameters.add("password", passwordObj);
MyReturnObj ret = rt.postForObject(endpoint, parameters, MyRequestObj.class);
我还有一个日志记录拦截器,所以我可以调试输入参数,它们几乎正确!目前,usernameObj
和passwordObj
参数显示为:
{"username":[{"testuser"}],"password":[{"testpassword"}]}
我想要它们的样子如下:
username={"testuser"},password={"testpassword"}
假设usernameObj
和passwordObj
是已编组为JSON的Java对象。
我做错了什么?
答案 0 :(得分:2)
好吧,所以我在大多数情况下最终搞清楚这一点。我最后只是写了一个marshaller / unmarshaller所以我可以在更细粒度的水平上处理它。这是我的解决方案:
RestTemplate rt = new RestTemplate();
// Create a multimap to hold the named parameters
MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>();
parameters.add("username", marshalRequest(usernameObj));
parameters.add("password", marshalRequest(passwordObj));
// Create the http entity for the request
HttpEntity<MultiValueMap<String,String>> entity =
new HttpEntity<MultiValueMap<String, String>>(parameters, headers);
// Get the response as a string
String response = rt.postForObject(endpoint, entity, String.class);
// Unmarshal the response back to the expected object
MyReturnObj obj = (MyReturnObj) unmarshalResponse(response);
这个解决方案让我可以控制对象如何编组/解组,只需发布字符串而不是让Spring直接处理对象。它帮助极大!
答案 1 :(得分:1)
对于客户端
要将对象作为json字符串传递,请使用MappingJackson2HttpMessageConverter
。
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
对于服务器端弹簧配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonMessageConverter"/>
</list>
</property>
</bean>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>