0

私は非常に長い間この問題に悩まされてきました。インターネット上のリソースを調べましたが、どこが間違っているのかわかりません。JSON を送受信するように Spring MVC を構成しました。@ResponseBody の Web ブラウザーから RESTful サービスを呼び出すと、返されるオブジェクトが JSON として返されます。ただし、 @RequestBody を呼び出そうとすると、できません。

以下はコードです:

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
     <display-name>WebApp</display-name>

     <context-param>
        <!-- Specifies the list of Spring Configuration files in comma     separated format.-->
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/history-service.xml</param-value>
     </context-param>

     <listener>
        <!-- Loads your Configuration Files-->
        <listener-    class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

     <servlet>
        <servlet-name>history</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
     </servlet>

     <servlet-mapping>
        <servlet-name>history</servlet-name>
        <url-pattern>/</url-pattern>
     </servlet-mapping>

     <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>    

history-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>     
    <context:component-scan base-package="com.web"/>

    <mvc:annotation-driven/>

    <context:annotation-config/>

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

    <bean id="jacksonMessageChanger" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json"/>
    </bean>

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageChanger"/>
            </list>
        </property>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json"/>
            </map>
        </property>
    </bean>-->  

コントローラ クラス

   @Controller
   @RequestMapping("/history/*")
   public class ControllerI {

@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-            type=application/json"})
public @ResponseBody UserResponse save(@RequestBody User user) throws Exception {
    UserResponse userResponse = new UserResponse();
    return userResponse;
}

@RequestMapping(value = "delete", method = RequestMethod.GET)
public @ResponseBody UserResponse delete() {
    System.out.println("Delete");
    UserResponse userResponse = new UserResponse();
    userResponse.setSuccess(true);
    return userResponse;
}

/webapp/history/delete を呼び出すと、JSON を受け取ることができます。

索引.jsp

    <%@page language="java" contentType="text/html"%>
 <html>
 <head>
 </head>
 <body>
 <h2>WebApp</h2>
<form action="/webapp/history/save" method="POST" accept="application/json">
    <input name="userId" value="Hello">
    <input name="location" value="location">
    <input name="emailAddress" value="hello@hello.com">
    <input name="commitMessage" value="I">
    <input type="submit" value="Submit">
</form>
</body>
</html>

ただし、/save を呼び出すと、次のエラーが発生します。

org.springframework.web.servlet.mvc.support.DefaultHandlerE
xceptionResolver handleNoSuchRequestHandlingMethod
WARNING: No matching handler method found for servlet request: path '/history/sa
ve', method 'POST', parameters map['location' -> array<String>['location'], 'use
rId' -> array<String>['Hello'], 'emailAddress' -> array<String>['hello@hello.com'], 'commitMessage' -> array<String>['I']]

どこが間違っているのかわかりません。私がやりたいことは、JSP を介して Spring MVC コントローラーに JSON を送信することだけです。これにより、@RequestBody を JSON から Java に逆シリアル化できます。

お役に立てれば幸いです。

4

2 に答える 2

1

JSONデータを投稿していません。フォーム入力を JSON に変換するには、javascript などを使用する必要があります。これにはjqueryがとても便利です。または、コントローラーを受け入れるように変更します

headers = "content-type=application/x-www-form-urlencoded"

参考までに、FF または Chrome の開発者ツールを使用して、フォームを送信するときにヘッダーを表示できます。具体的には、ネットワーク パネル (Chrome 用)。 https://developers.google.com/chrome-developer-tools/docs/network

Firefox の Web コンソールだと思います。https://developer.mozilla.org/en-US/docs/Tools/Web_Console?redirectlocale=en-US&redirectslug=Using_the_Web_Console

Jquery を使用してフォーム入力を投稿する:

<script type="text/javascript">
   $(function() {
     var frm = $("#MyForm); // In the JSP/HTML give your form an id (<form id="MyForm" ...)
     var dat = JSON.stringify(frm.serializeArray());

     $.ajax({
          type: 'POST',
          url: url,
          data: dat,
          success: function(hxr) {
              alert("Success: " + xhr);
          }

          dataType: 'json'
       });
     );
 });
</script>

詳細はこちら: http://api.jquery.com/jQuery.post/

于 2012-09-17T15:21:07.093 に答える
1

HTML フォームでaccept="application/json"をenctype ="application/json"に変更します。

現在のヘッダーを設定していないため、Spring は投稿データを解析できません。@RequestBody を使用する場合、デフォルトの受け入れ enctype は application/json です。次のいずれかを試してください。

  1. html フォームまたは js ポスト関数に post headers="content-type=application/json" を設定します。
  2. headers="content-type=application/x-www-form-urlencoded" を受け入れるようにコントローラーを設定します。

編集

enctype はヘッダーと同じでなければなりません。OK、コードは次のいずれかのようになります。

// the one
@RequestMapping(value = "save", method = RequestMethod.POST)
public @ResponseBody UserResponse save(@RequestBody User user) throws Exception {
    UserResponse userResponse = new UserResponse();
    return userResponse;
}


</form>
<form action="/webapp/history/save" method="POST" enctype="application/x-www-form-urlencoded">
    <input name="userId" value="user">
    <input name="location" value="location">
    <input name="emailAddress" value="hello@hello.com">
    <input name="commitMessage" value="I">
    <input type="submit" value="Submit">
</form>


// the other
@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
public @ResponseBody UserResponse save(@RequestBody User user) throws Exception {
    UserResponse userResponse = new UserResponse();
    return userResponse;
}


</form>
<form action="/webapp/history/save" method="POST" enctype="application/json">
    <input name="userId" value="user">
    <input name="location" value="location">
    <input name="emailAddress" value="hello@hello.com">
    <input name="commitMessage" value="I">
    <input type="submit" value="Submit">
</form>

上記のいずれかを試してください。

次のエラーが表示されます。

HTTP エラー 415: 要求エンティティが、要求されたメソッド () の要求されたリソースでサポートされていない形式であるため、サーバーはこの要求を拒否しました。

于 2012-09-17T15:42:23.083 に答える