2011-04-24 29 views
8

estoy usando la siguiente definición de frijol para hacer mi aplicación primavera hablando en JSON@JsonView con Spring MVC

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 

¿Es posible con este mensaje convertidor de frijol de utilizar la anotación @JsonView?

+0

solo para su información, finalmente terminé escribiendo mi propia opinión – Erik

Respuesta

18

@JsonView es already supported en el procesador Jackson JSON de v1.4 en adelante.

Nueva edición: Actualización para Jackson 1.9.12

De acuerdo con la v1.8.4 documentation la función que estaba usando writeValueUsingView está ahora DesfasadaUso ObjectMapper.viewWriter (java.lang.Class) en lugar & hellip; sin embargo, también ha sido DeprecatedDesde 1.9, use writerWithView (Class) en su lugar! (Ver v1.9.9 documentation)

Así que aquí es un ejemplo actualizado, probado con Spring 3.2.0 y 1.9.12 Jackson, que simplemente devuelve {id: 1} y no extendida {name: "name"} ya que está utilizando el .writerWithView(Views.Public.class). El cambio a Views.ExtendPublic.class dará lugar a {"id":1,"name":"name"}

package com.demo.app; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 

import org.codehaus.jackson.map.annotate.JsonView; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.ObjectWriter; 

import javax.servlet.http.HttpServletResponse; 

import java.io.IOException; 

@Controller 
public class DemoController { 
    private final ObjectMapper objectMapper = new ObjectMapper(); 

    @RequestMapping(value="/jsonOutput") 
    @ResponseBody 
    public String myObject(HttpServletResponse response) throws IOException { 
     ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class); 
     return objectWriter.writeValueAsString(new MyObject()); 
    } 

    public static class Views { 
     static class Public {} 
     static class ExtendPublic extends Public {} 
    } 

    public class MyObject { 
     @JsonView(Views.Public.class) Integer id = 1; 
     @JsonView(Views.ExtendPublic.class) String name = "name"; 
    } 
} 

Edición Anterior: Es necesario crear una instancia del ObjectMapper y escribir el objeto con una vista personalizada como se muestra here, o en este ejemplo:

Definir puntos de vista:

class Views { 
    static class Public {} 
    static class ExtendedPublic extends PublicView {} 
    ... 
} 

public class Thing { 
    @JsonView(Views.Public.class) Integer id; 
    @JsonView(Views.ExtendPublic.class) String name; 
} 

Use vistas:

private final ObjectMapper objectMapper = new ObjectMapper(); 

@RequestMapping(value = "/thing/{id}") 
public void getThing(@PathVariable final String id, HttpServletResponse response) { 
    Thing thing = new Thing(); 
    objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class); 
} 

Si está usando Jackson> = 1.7 puede encontrar que el @JSONFilter se adapta mejor a sus necesidades.

+0

Sí, pero ¿cómo sabe el Mapper qué vista mostrar? – Erik

+0

No creo que el mapeador pueda saberlo. Tienes que escribir el objeto tú mismo. He editado mi respuesta, pero también he agregado un enlace al '@ JSONFilter', que podría ser mejor para ti. Dado que el ejemplo en mi respuesta siempre escribirá salida con formato JSON. Si necesita admitir otros formatos de salida, esto no funcionará para usted. – andyb

+1

Por favor, vote para que sea una característica nueva: https://jira.springsource.org/browse/SPR-7156?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel –

7

@JsonView la anotación no fue soportada en Spring pero este problema está resuelto!
Siga this

añadir soporte para las vistas Jackson serialización

Spring MVC ahora es compatible con vistas serialización de Jackon para la representación subconjuntos diferentes de la misma POJO de diferentes controlador métodos (por ejemplo, la página detallada vs vista de resumen) Problema: SPR-7156

Este es el SPR-7156.

Estado: Resuelta

Descripción

anotación JSONView de Jackson permite al desarrollador de control que se serialiazed aspectos de un método. Con la implementación actual, se debe usar el escritor de vistas de Jackson pero luego el tipo de contenido no está disponible. Sería mejor si como parte de la anotación RequestBody, se pudiera especificar una JSONView.

Disponible en Spring ver >= 4.1

Gracias Primavera!