0

HTML フォームから、または resttemplate を使用してスタンドアロン クライアントから呼び出すことができるコントローラー メソッドを作成したいと考えています。

メソッドには次の署名があります。

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

問題は、HTML フォームを使用するとすべて正常に動作するのに、スタンドアロン クライアントを使用しようとすると、要求パラメーターの値が null になることです。

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>

前もって感謝します!

4

1 に答える 1

0

答えはあなたの投稿にあります:

@ModelAttribute なしでメソッドを試すと、スタンドアロン クライアントは機能しますが、HTML フォームは機能しません。

HTML アプリケーションを使用する場合、すべてのキーがitemCreateRequest.VARIABLE_NAMEで始まるマップを使用してサーバーにリクエストを送信すると思いますが、スタンドアロン アプリケーションを使用する場合は、宣言された @ModelAttribute なしでそのリクエストを送信します。

「 itemCreateRequest 」の場合、宣言された ModelAttribute は、そのコントローラーに送信される各情報の前に立つ必要があります。

次のようなことを試すことができます:

restTemplate.postForLocation("http://localhost:8080/ims_ui/items.xml", new HashMap<String, Object>(){
            {
                put("itemCreateRequest", icr);
            }
        });
于 2013-01-18T07:46:55.347 に答える