使用Spring RestTemplate用对象POST params

时间:2014-07-31 03:57:52

标签: java json spring resttemplate

我正在尝试使用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);

我还有一个日志记录拦截器,所以我可以调试输入参数,它们几乎正确!目前,usernameObjpasswordObj参数显示为:

{"username":[{"testuser"}],"password":[{"testpassword"}]}

想要它们的样子如下:

username={"testuser"},password={"testpassword"}

假设usernameObjpasswordObj是已编组为JSON的Java对象。

我做错了什么?

2 个答案:

答案 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"/>