使用JSON的Spring MVC RestTemplate POST

时间:2011-09-08 10:06:11

标签: json spring rest

我有一个Spring MVC Rest Controller,它只是添加了一个客户记录。我的休息服务传递JSON并且当我从Web客户端或像Soap-UI这样的测试床调用它时工作正常。但是,当我尝试使用RestTemplate进行POST时,我得到一个JacksonMappingException:无法构造CustomerObject的实例,问题:找不到合适的创建者方法。

这显然与我创建JSON请求的方式有关,所以在这里添加一些内容就是我正在做的事情:

我的测试帖子使用RestTemplate

 @Test
 public void postCustomerIntegrationTest() throws Exception{

    String JSONInput = ("{" +
          "  \"firstName\": \"Anouska\"," +
          "  \"lastName\": \"Williams\"," +
          "  \"email\": \"Anouska@place.com\"," +
          "  \"cardBin1\": 123456768," +
          "  \"cardBin2\": 123456789," +
          "  \"language\": \"Spanish\"," +
          "  \"country\": \"Mexico\"," +
          "  \"product\": \"shit\"," +
          "  \"telephoneNumber\": 447869995262," +
          "  \"termsAndConditions\": \"true\"" +
          "}");

  HttpHeaders headers = new HttpHeaders();
  headers.setContentType(MediaType.APPLICATION_JSON);

  HttpEntity request= new HttpEntity(JSONInput, headers);

Registration output = restTemplate.postForObject(BASE_URL, request, CustomerObject.class);

assertNotNull("no person",output);
assertNotNull(output.getId());
assertEquals("Bob", output.getFirstName());

}

我的RestTemplate通过Spring连接如下:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
    <list>
        <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="supportedMediaTypes" value="application/json" />
        </bean>
    </list>
</property>
</bean>

我在这里使用的测试JSON与我在Soap-UI中使用的测试JSON相同。在对代码进行了调整后,看起来它将我的JSON视为一个字符串而杰克逊试图转换整个事物,因为它无法找到一个辅助字段(当然它不能)。

我想我需要知道如何将JSON传递给我的RestTemplate,以便以正确的JSON格式获取请求。我花了整个上午试图找到一个例子,但在任何地方都找不到。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

至少有一个问题,最后一个参数应该是响应类

Registration output = restTemplate.postForObject(BASE_URL, request, Registration.class);

答案 1 :(得分:0)

这是我发布json的方式:

CustomerObject object = template.postForObject(
            BASE_URL, request, CustomerObject.class);

Customer Object类必须包含字段:firstName,lastName ...