2011-03-21 22 views
8

Aquí tenemos una aplicación web básica que utiliza JSP que necesita proporcionar algunas URL de servicio REST basadas en JSON.Spring MVC - Forzar un controlador para producir MappingJacksonJsonView (s)

Estas URL residirán bajo /services y se generarán por MyRestServicesController.

Los ejemplos que veo para la configuración de las vistas basadas en JSON usan ContentNegotiatingViewResolver. Pero parece exagerado para mí, ya que este resolvedor parece destinado a situaciones en las que la misma URL puede producir resultados diferentes.

Solo quiero que mi RestServicesController siempre produzca MappingJacksonJsonView(s).

¿Existe una manera más directa y directa de simplemente dirigir el controlador para que haga esto?

+0

¿Desea específicamente 'MappingJacksonJsonView', o simplemente desea que se genere JSON? – skaffman

+0

La salida JSON es el objetivo final, el uso de los componentes de resorte estándar parece una buena práctica. Johan lo golpeó en la cabeza. –

Respuesta

12

¿Existe una manera más directa y directa de simplemente dirigir el controlador para que haga esto?

Sí, lo hay. Puede echar un vistazo a esta muestra que publiqué en Spring forums. En resumen, la forma en que prefiero hacerlo es a través de lo siguiente.

Application Context:

<!-- json view, capable of converting any POJO to json format --> 
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 

controlador

@RequestMapping("/service") 
public ModelAndView getResultAsJson() { 
    Object jsonObj = // the java object which we want to convert to json 
    return new ModelAndView("jsonView", "result", jsonObj); 
} 

EDITAR 2013: En estos tiempos modernos, el enfoque de @ skaffman sería una buena alternativa.

+0

Oh yeh, eso tiene sentido total, y es muy simple. Exactamente lo que esperaba, y una respuesta súper rápida. Un millón de gracias. Debo haber leído sobre el solucionador BeanName 5 veces y nunca hizo clic para usarlo, creo que mi cabeza aún estaba atascada en template-land. –

9

Si todo lo que necesita hacer es generar JSON, entonces la capa de visualización en sí es redundante. Puede use the @ResponseBody annotation para indicarle a Spring que serialice su modelo directamente, usando Jackson. Requiere menos configuración que el enfoque MappingJacksonJsonView, y el código es menos abarrotado.

+1

+1 esto funciona para mí. ¿Sabes cómo podría cambiar el tipo de contenido? – stacker

+2

Hay una desventaja para @ResponseBody, después de que el controlador regrese, la vista se renderiza inmediatamente, lo que cierra el HttpResponse para que los encabezados no se puedan agregar (como por ejemplo a través del método postHandle de un Interceptor). El uso de ContentNegotiatedViewResolver no tiene este problema. – devdanke

Cuestiones relacionadas