私はジャクソンのものとしてメッセージコンバータを設定します
class Foo{int x; int y}
そしてコントローラーで
@ResponseBody
public Foo method(){
return new Foo(3,4)
}
それから、他の設定なしでサーバーからJSON文字列{x: '3'、y: '4'}を返すことを期待しています。しかし、私のajaxリクエストに対する404エラー応答を取得する
メソッドに@ResponseBodyアノテーションが付けられている場合、戻り値のタイプは応答HTTP本文に書き込まれます。戻り値は、HttpMessageConvertersを使用して、宣言されたメソッド引数タイプに変換されます。
私が間違っている ?または、シリアライザーを使用して自分で応答オブジェクトをJson文字列に変換し、その文字列を応答として返す必要があります(文字列応答を正しく行うことができます)または他の設定を行う必要がありますか?クラスFooに注釈を追加するような
ここに私のconf.xmlがあります
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
次のものが必要です。
<mvc:annotation-driven />
にspring.xml
を配置しますorg.codehaus.jackson:jackson-mapper-asl
)を配置します。次のように使用します。
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
public @ResponseBody Foo method(@Valid Request request, BindingResult result){
return new Foo(3,4)
}
これは私のために動作します。
その点に注意してください
@ResponseBody
は、メソッド定義ではなく戻り値の型に適用されます。@RequestMapping
アノテーションが必要です。MessageConverterインターフェース http://static.springsource.org/spring/docs/3.0.x/javadoc-api/ は、MappingJacksonMessageCoverterがapplication/jsonを返すgetSupportedMediaTypes()メソッドを定義します
public MappingJacksonHttpMessageConverter() {
super(new MediaType("application", "json", DEFAULT_CHARSET));
}
Accept:application/jsonリクエストヘッダーが欠落していると思います。
これは私のために働いた:
_@RequestMapping(value = "{p_LocationId}.json", method = RequestMethod.GET)
protected void getLocationAsJson(@PathVariable("p_LocationId") Integer p_LocationId,
@RequestParam("cid") Integer p_CustomerId, HttpServletResponse response) {
MappingJacksonHttpMessageConverter jsonConverter =
new MappingJacksonHttpMessageConverter();
Location requestedLocation = new Location(p_LocationId);
MediaType jsonMimeType = MediaType.APPLICATION_JSON;
if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) {
try {
jsonConverter.write(requestedLocation, jsonMimeType,
new ServletServerHttpResponse(response));
} catch (IOException m_Ioe) {
// TODO: announce this exception somehow
} catch (HttpMessageNotWritableException p_Nwe) {
// TODO: announce this exception somehow
}
}
}
_
メソッドは何も返さないことに注意してください:MappingJacksonHttpMessageConverter#write()
は魔法を使います。
HTTP 404エラーは、リソースが見つからないことを意味します。それには2つの原因があります。
1を修正するには、正しいリクエストURLを使用または提供していることを確認してください(大文字と小文字を区別します!)。 2を修正するには、サーバーの起動ログで起動エラーを確認し、それに応じて修正します。
これはすべて、これまでに投稿されたコードと情報を超えています。
Jackson-mapper-asl.jarだけでなく、jackson-core-asl.jarも必要であることがわかりました
ここでの答えに加えて..
クライアント側でjqueryを使用している場合、これは私のために働いた:
Java:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestBody Foo json) {
Jquery(JSON.stringify関数を使用するには、Douglas Crockfordのjson2.jsを含める必要があります):
$.ajax({
type: "post",
url: "sync", //your valid url
contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
data: JSON.stringify(jsonobject), //json object or array of json objects
success: function(result) {
//do nothing
},
error: function(){
alert('failure');
}
});
404はHttpMessageConverterとは関係ないと思います。私は同じ404問題を抱えていました。その理由は、一致するリクエストだけを忘れていたためです<url-pattern>
がDispatcherServletに送信されます(要求のマッピングを* .doから* .jsonに変更しました)。たぶんこれもあなたの場合です。