Estoy recibiendo el siguiente error al tratar de obtener una solicitud JSON y procesarla:
org.codehaus.jackson.map.JsonMappingException: No se ha encontrado un constructor adecuado para el tipo [tipo simple, clase com.myweb.ApplesDO]: no se puede instanciar a partir de un objeto JSON (¿es necesario añadir/habilitar la información del tipo?)
Aquí está el JSON que estoy tratando de enviar:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
En el controlador, tengo la siguiente firma de método:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO es un wrapper de ApplesDO :
public class AllApplesDO {
private List<ApplesDO> applesDO;
public List<ApplesDO> getApplesDO() {
return applesDO;
}
public void setApplesDO(List<ApplesDO> applesDO) {
this.applesDO = applesDO;
}
}
ApplesDO:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String appl) {
this.apple = apple;
}
public ApplesDO(CustomType custom){
//constructor Code
}
}
Creo que Jackson no es capaz de convertir JSON en objetos Java para las subclases. Por favor, ayuda con los parámetros de configuración para Jackson para convertir JSON en objetos Java. Estoy usando Spring Framework.
EDIT: Incluido el principal error que está causando este problema en la clase de ejemplo anterior - Por favor, busque la respuesta aceptada para la solución.
Por fin me he dado cuenta de cuál es el problema. No es un problema de configuración de Jackson como dudaba.
En realidad el problema estaba en la clase ApplesDO:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String apple) {
this.apple = apple;
}
public ApplesDO(CustomType custom) {
//constructor Code
}
}
Había un constructor personalizado definido para la clase que lo convertía en el constructor por defecto. La introducción de un constructor ficticio ha hecho que el error desaparezca:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String apple) {
this.apple = apple;
}
public ApplesDO(CustomType custom) {
//constructor Code
}
//Introducing the dummy constructor
public ApplesDO() {
}
}
Esto sucede por estas razones:
su clase interna debe ser definida como estática.
private static class Condición { //específica de Jackson
}
Puede ser que no tengas ningún constructor por defecto en tu clase (Actualización: Parece que no es el caso)
private static class Condición {
private Long id;
public Condición() {
}
// Setters y Getters
}
Puede ser que tus Setters no estén definidos correctamente o no sean visibles (por ejemplo, setter privado)
¿Puedes probar esta estructura? Si recuerdo bien se puede utilizar de esta manera:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
En segundo lugar, por favor, añadir constructor por defecto a cada clase también podría ayudar.