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 オブジェクトを渡す方法についてはまだ興味があります。