Spring 3.0 making JSON response using jackson message converter

i configure my messageconverter as Jackson's then

class Foo{int x; int y}

and in controller

@ResponseBody
public Foo method(){
   return new Foo(3,4)
}

from that im expecting to return a JSON string {x:'3',y:'4'} from server without any other configuration. but getting 404 error response to my ajax request

If the method is annotated with @ResponseBody, the return type is written to the response HTTP body. The return value will be converted to the declared method argument type using HttpMessageConverters.

Am I wrong ? or should I convert my response Object to Json string myself using serializer and then returning that string as response.(I could make string responses correctly) or should I make some other configurations ? like adding annotations for class Foo

here is my 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>


You need the following:

  • Set annotation-driven programming model: put <mvc:annotation-driven /> in spring.xml
  • Place jaskson jar (Maven artifactId is org.codehaus.jackson:jackson-mapper-asl ) in classpath.
  • Use as the following:

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
    public @ResponseBody Foo method(@Valid Request request, BindingResult result){
    return new Foo(3,4)
    }
    
  • This works for me.

    Please note, that

  • @ResponseBody is applied to return type, not to the method definition.
  • You need @RequestMapping annotation, so that Spring will detect it.

  • This worked for me:

    @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
                }
            }
    }
    

    Note that the method doesn't return anything: MappingJacksonHttpMessageConverter#write() does the magic.


    The MessageConverter interface http://static.springsource.org/spring/docs/3.0.x/javadoc-api/ defines a getSupportedMediaTypes() method, which in case of the MappingJacksonMessageCoverter returns application/json

    public MappingJacksonHttpMessageConverter() {
        super(new MediaType("application", "json", DEFAULT_CHARSET));
    }
    

    I assume a Accept: application/json request header is missing.

    链接地址: http://www.djcxy.com/p/48450.html

    上一篇: Spring MVC POST @RequestBody不绑定到http请求中的JSON字符串

    下一篇: Spring 3.0使用杰克逊消息转换器进行JSON响应