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 {
@RequestMapping("/usuario")
public class UsuarioController {
@Autowired
private GenericResponse genericResponse;
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;
}
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;
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>
<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)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class ErrorResponse {
private String message;
private IWrapper data;
private IWrapper data;
@JsonProperty
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
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;
}
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