2013-01-17 74 views
0

我想創建一個控制器方法,可以使用resttemplate從html表單或獨立客戶端調用控制器方法。具有相同參數的@RequestBody和@ModelAttribute的彈簧控制器

的方法有此簽名:

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView save(@RequestBody @ModelAttribute(value = "itemCreateRequest") 
    ItemCreateRequest request, Model model) throws NoSuchMethodException, 
    SecurityException, InstantiationException, IllegalAccessException, 
    IllegalArgumentException, InvocationTargetException { 
... 
} 

的問題是,如果我使用HTML表單,一切正常,但是當我嘗試使用獨立客戶端的請求參數的值進來空值。

ItemCreateRequest icr = new ItemCreateRequest(); 
icr.setItem(new ItemDTO(null, "23", "bla", "bla bla")); 
restTemplate.postForLocation("http://localhost:8080/ims_ui/items.xml", icr); 

如果我嘗試的方法而不@ModelAttribute的獨立客戶端的作品,但HTML表格不。

這是我的servlet-context.xml中的配置提前

<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 
    <beans:bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <beans:property name="messageConverters"> 
      <beans:list> 
       <beans:bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
        <beans:property name="marshaller" ref="marshaller"/> 
        <beans:property name="unmarshaller" ref="marshaller"/> 
       </beans:bean> 
       <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
       <beans:bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

    <beans:bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <beans:property name="order" value="0" /> 
    <beans:property name="mediaTypes"> 
     <beans:map> 
     <beans:entry key="jsp" value="application/html" /> 
     <beans:entry key="xml" value="application/xml" /> 
     </beans:map> 
    </beans:property> 

    <beans:property name="defaultViews"> 
     <beans:list> 
     <!-- XML View --> 
     <beans:bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
      <beans:constructor-arg ref="marshaller" /> 
     </beans:bean> 
     </beans:list> 
    </beans:property> 
    </beans:bean> 

    <beans:bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <beans:property name="contextPaths"> 
      <beans:array> 
       <beans:value>net.franciscovillegas.summa.ims.dto</beans:value> 
       <beans:value>net.franciscovillegas.summa.ims.service.requests</beans:value> 
      </beans:array> 
     </beans:property> 
    </beans:bean> 

謝謝!

回答

0

答案是你後:

如果我不嘗試的@ModelAttribute方法的獨立客戶端 作品,但HTML表格不。

我認爲,當你使用HTML應用程序你發送一個請求到服務器的地圖,所有按鍵與itemCreateRequest.VARIABLE_NAME開始,但是當你使用獨立的應用程序,您將請求發送沒有聲明的@ModelAttribute。

聲明的ModelAttribute,在你的情況下,「itemCreateRequest」,應該站在發送給該控制器的每個信息的前面。

你可以嘗試這樣的事情:

restTemplate.postForLocation("http://localhost:8080/ims_ui/items.xml", new HashMap<String, Object>(){ 
      { 
       put("itemCreateRequest", icr); 
      } 
     });