20

Map の JSON 表現をコントローラーに POST パラメーターとして送信しようとしています。

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@RequestParam("filters") HashMap<String,String> filters, HttpServletRequest request) {
       //do stuff
}

@RequestParam は単に 500 エラーをスローすることがわかったので、代わりに @ModelAttribute を使用してみました。

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@ModelAttribute("filters") HashMap<String,String> filters, HttpServletRequest request) {
       //do stuff
}

これはリクエストに正しく応答しますが、マップが空であることに気付きました。後の実験で、(HashMap だけでなく) どのオブジェクトもインスタンス化されることがわかりましたが、フィールドは入力されませんでした。私のクラスパスには Jackson があり、コントローラーは JSON で応答します。ただし、現在の構成では、Spring が GET/POST パラメーターを介して JSON を読み取ることを許可していないようです。

オブジェクトの JSON 表現をクライアント側の AJAX リクエストからリクエスト パラメータとして Spring コントローラに渡し、Java オブジェクトを取得するにはどうすればよいですか?

EDIT関連するSpring構成を追加する

  <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
      <map>
        <entry key="html" value="text/html" />
        <entry key="json" value="application/json" />
      </map>
    </property>
    <property name="viewResolvers">
      <list>
        <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
          <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
          <property name="prefix" value="/WEB-INF/jsp/" />
          <property name="suffix" value=".jsp" />
        </bean>
      </list>
    </property>
    <property name="defaultViews">
      <list>
        <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
          <property name="prefixJson" value="true" />
        </bean>
      </list>
    </property>
  </bean>
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
      <list>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
      </list>
    </property>
  </bean>

コメンターの提案で、@RequestBody を試しました。JSON 文字列が二重引用符で囲まれている限り、これは機能します。

@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" })
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) {
      //do stuff
}

これで当面の問題は解決しますが、AJAX 呼び出しを介して複数の JSON オブジェクトを渡す方法についてはまだ興味があります。

4

6 に答える 6

2

Jackson ライブラリを使用して、Json から Map に変換できます。

@web-context.xml

<bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
        </list>
    </property>
</bean>

@maven の依存関係:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-lgpl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.9.13</version>
</dependency>

@コントローラ

@RequestMapping(value = "/method", method = RequestMethod.DELETE)
public String method(
                @RequestBody Map<String, Object> obj){

@Request (例: jquery Ajax)

$.ajax({"type": "DELETE",
        "contentType": "application/json;",
        "url": "/method",
        "data": JSON.stringify({"key": "Ricardo"}),
        "dataType": "json";}
});

Python フレームワークまたは Play を使用すると、はるかに簡単になります。うわー

于 2014-03-31T12:24:28.643 に答える