2010-10-13 219 views
4

我试图使用postForObject(...)方法使用restTemplate测试我们的REST服务。spring restTemplate复杂对象的POST参数

单元测试:

@Test 
    public void testPostOrder() { 
     String url = BASE_URL + "/orders/"; 
     OrderDto orderDtoInput = new OrderDto(); 
     orderDtoInput.setCustomerId(34); 


     UpdateReportDto updateReport = restTemplate.postForObject(url, 
       orderDtoInput, UpdateReportDto.class, new Object[] {}); 
     } 

有趣片我的配置的:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="formHttpMessageConverter" /> 
      <ref bean="marshallingHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="formHttpMessageConverter" class="org.springframework.http.converter.FormHttpMessageConverter"> 
</bean> 

据我所知,FormHttpMessageConverter将转换为和从MultiValueMap和媒体类型 应用程序/ x WWW的形式-urlencoded。

是否有任何魔术或工具我可以使用或电汇将我的Dto转换为MultiValueMap?还是我需要循环对象属性,并在我的测试中构建自己的MultiValueMap?

我的服务器要求得到那个看起来像这样POST参数:

id=11752&firstName=Joe&active=true&address1=1122&address2=2233&c 
ellPhone=123-321-1234&childrensName1=bobby1&childrensName2=bobby2&childrensName3=bobby3&childrensName4=bobby4&city=someCity& 
customHobbies=loves To Fly Planes&distributorId=407&[email protected]&fax=321-123-1234&fellowship=good fellows&fishing=false&golf=true&hunting=false& 
insuranceCompany1=ins1&insuranceCompany2=ins2&insuranceCompany3=ins3&insuranceCompany4=ins4&lastName=Brownie& 
mailMerge=true&medicalSchool=Granada U&officeDays=4&officeManager=manager&officeManagerPhone=456.654.4567&other=true& 
paNurse=nurse 1&paNursePhone=345-543-3456& 
phone=234-432-2345& 
salesRepresentativeId=1935&specialty=meatball surgery&spouseName=Betty&state=AL& 
surgeryDays=22&title=doc&version=2&zip=47474 
promptValues[0].id=12&promptValues[0].miscPromptId=882&promptValues[0].value=meFirst& 
promptValues[1].id=13&promptValues[1].miscPromptId=881&promptValues[1].value=youToo&residency=Jamaica General& 
surgeonClinics[0].address1=newAddress&surgeonClinics[0].address2=newAddress2&surgeonClinics[0].city=clinic City& 
surgeonClinics[0][email protected]&surgeonClinics[0].fax=123.456.7890&surgeonClinics[0].id=33273& 
surgeonClinics[0].name=clinic name&surgeonClinics[0].phone=890-098-4567& 
surgeonClinics[0].zip=34567&surgeonClinics[0].surgeryCenter1=MySurgeryCenter1& 
surgeonClinics[0].surgeryCenter2=MySurgeryCenter2& 
surgeonClinics[1].address1=newAddress11&surgeonClinics[1].address2=newAddress22&surgeonClinics[1].city=clinic2 City& 
surgeonClinics[1][email protected]&surgeonClinics[1].fax=123.456.7890&surgeonClinics[1].id=33274& 
surgeonClinics[1].name=clinic2 name&surgeonClinics[1].phone=890-098-4567& 
surgeonClinics[1].zip=34567& 
surgeonClinics[1].surgeryCenter1=MySurgeryCenter21&surgeonClinics[1].surgeryCenter2=MySurgeryCenter22& 

这里就是我不明白:我们的RestServiceController方法知道如何利用这个疯狂的参数列表并重新创建我们的DTO目的。我们可以使用curl成功调用它。似乎在客户端应该存在一些相互的魔法来将Dto变成参数列表。
下面是在服务器端控制方法的签名:

// createOrder 
    @RequestMapping(method = { RequestMethod.POST, RequestMethod.PUT }, value = "/orders/") 
    @ResponseBody 
    public UpdateReportDto createOrder(OrderDto orderDto, 
      HttpServletRequest httpServletRequest, 
      HttpServletResponse httpServletResponse) { 

回答

0

您可以使用RestTemplate与信息转换器。我已经测试过它,它可以工作

  RestTemplate restTemplate = new RestTemplate(); 
      List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
      messageConverters.add(new MappingJackson2HttpMessageConverter()); 
      restTemplate.setMessageConverters(messageConverters); 

      restTemplate.postForEntity(url, requestBodyObject, returnTypeClass);