我将我的messageconverter配置为杰克逊的
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>
答案 0 :(得分:22)
您需要以下内容:
<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
注释,以便Spring检测到它。答案 1 :(得分:3)
这对我有用:
@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()
具有魔力。
答案 2 :(得分:3)
MessageConverter接口http://static.springsource.org/spring/docs/3.0.x/javadoc-api/定义了一个getSupportedMediaTypes()方法,在MappingJacksonMessageCoverter的情况下返回application / json
public MappingJacksonHttpMessageConverter() {
super(new MediaType("application", "json", DEFAULT_CHARSET));
}
我假设缺少一个Accept:application / json请求标头。
答案 3 :(得分:2)
HTTP 404错误仅表示无法找到资源。这可能有两个原因:
要修复1,请确保您使用或提供正确的请求网址(区分大小写!)。要修复2,请检查服务器启动日志以查找任何启动错误并相应地修复它们。
这一切都超出了迄今为止发布的代码和信息。
答案 4 :(得分:1)
我发现我也需要jackson-core-asl.jar,而不仅仅是jackson-mapper-asl.jar
答案 5 :(得分:0)
答案 6 :(得分:0)
我猜404与你的HttpMessageConverter无关。我有同样的404问题,原因是我忘了只有匹配 <url-pattern>
的请求被发送到DispatcherServlet(我将请求映射从* .do更改为* .json)。也许这也是你的情况。
答案 7 :(得分:0)
除了这里的答案..
如果你在客户端使用jquery,这对我有用:
爪哇:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestBody Foo json) {
Jquery(你需要包含Douglas Crockford的json2.js以获得JSON.stringify函数):
$.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');
}
});