objeto - leer json en java
Jersey: No se encontrĂ³ un constructor adecuado para el tipo[tipo simple, clase Cosa]: no se puede crear una instancia del objeto JSON (2)
Necesita un constructor y @JsonCreator
, o use @JsonCreator
. Lo más fácil de hacer sería simplemente agregar el no-arg con los configuradores. Jackson necesita los setters cuando deserializa. Para la serialización, todo lo que se necesita son getters.
EDITAR
Para mantenerlo inmutable, puede usar @JsonCreator
en el constructor. Por ejemplo
@JsonCreator
public Thing(@JsonProperty("symbol") String symbol,
@JsonProperty("name") String name) {
this.symbol = symbol;
this.name = name;
}
Tengo un recurso con un método como:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/add")
public Response putThing(Thing thing) {
try {
//Do something with Thing object
return Response.status(HttpStatus.SC_OK).build();
} catch (Exception e) {
log.error("Request failed", e);
return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
}
}
Cosa:
public class Thing {
private final String symbol;
private final String name;
public Stock(String symbol, String name) {
this.symbol = symbol;
this.name = name;
}
public String getSymbol() {
return this.symbol;
}
public String getName() {
return this.name;
}
}
Cuando hago una solicitud PUT como:
PUT /rest/add HTTP/1.1
Host: localhost:8135
Content-Type: application/json
Cache-Control: no-cache
{"symbol":"some symbol","name":"some name"}
Me sale la siguiente respuesta:
No se encontró un constructor adecuado para el tipo [tipo simple, clase Cosa]: no se puede crear una instancia del objeto JSON (¿faltan el constructor o el creador predeterminado, o tal vez es necesario agregar / habilitar información de tipo?)
¿Por qué Jersey / Jackson no está deserializando mi objeto JSON en mi POJO?
No soy absolutamente positivo, pero creo que esto es todo.
La forma en que Jackson quiere trabajar es la siguiente: crea el objeto utilizando el constructor predeterminado (sin argumentos). Luego usa los configuradores para establecer cada una de las variables de instancia. Esto puede parecer un camino largo, pero en realidad es la única manera, porque Jackson no puede ser lo suficientemente inteligente como para determinar en qué orden pasar los parámetros del constructor. Entonces, su código tiene dos problemas principales (bueno, tres, pero Voy a suponer que su clase se llamaba Stock antes de que prácticamente la haya limpiado para su publicación ;-)).
1. Necesitas un constructor sin argumentos. Por lo que sé, java proporciona un constructor predeterminado si no escribes uno, pero tan pronto como creas cualquier constructor, el constructor predeterminado sin argumentos desaparece.
2. Necesita setters para sus variables de instancia (y hacerlos públicos no es lo suficientemente bueno, tienen que tener setters reales). Oh, parece que las variables de tu instancia son finales, eso no va a funcionar. Mi forma favorita de administrar todos los configuradores copiados / pegados es usar una biblioteca llamada lombok. De todos modos, por ahora solo necesitas esos setters.