miércoles, enero 16, 2013

Spring MVC / Jackson : como ignorar bean metadata y otras propiedades

Estaba tratando de usar jackson en mi proyecto actual con Spring MVC 3, tengo un metodo en el controlador parecido al siguiente:

@Controller
@RequestMapping("/usuario")
public class UsuarioController {

    @Autowired
    private GenericResponse genericResponse;

    @RequestMapping(value = "/{nombre}", method = GET)
    public @ResponseBody GenericResponse regresaDatos(@PathVariable String nombre) {
        try {
            genericResponse.setData(servicio.getDatos(nombre));
        }
       
        catch(Exception e) {
            genericResponse.setMessage("Error al obtener datos");
        }
       
        return genericResponse;
    }

La clase GenericResponse

public class GenericResponse {
    private String message;
    private IWrapper data;
   ...
    setters y getters aqui
    ...
}

Cuando utilizas Jackson con spring mvc y la anotacion @ResponseBody en el retorno de un metodo, jackson convertira el retorno del metodo a JSON

El problema es que el objeto genericResponse es un proxy bean con scope request:

    <bean id="genericResponse" class="com.mycompany.common.GenericResponse" scope="request">
        <aop:scoped-proxy />
    </bean>

Esto implica que Spring agrega al proxy infinidad de propiedades y metadatos que Jackson intenta convertir a JSON tambien, como eso no es lo que quiero me puse a investigar como evitar que Jackson convierta las propiedades no deseadas.

La solucion es agregar las siguientes anotaciones en la clase GenericResponse:

@JsonIgnoreProperties({"proxyTargetClass", "exposeProxy", "frozen", "preFiltered"})
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class ErrorResponse {
    private String message;
    private IWrapper data;

    @JsonProperty
    public String getMessage() {
        return message;
    }
   
    public void setMessage(String message) {
        this.message = message;
    }


    @JsonProperty    
    public IWrapper getData() {
        return data;
    }
   
    public void setData(IWrapper data) {
        this.data = data;
    }
}

Con esto Jackson convierte el objeto a JSON de la manera esperada.

No hay comentarios.:

Publicar un comentario