Ahoj,
pokouším se lehce dráždit JEE7 na Wildfly (beta verze) a po očku kouknout i na
ten rest+json, když už to teď tak frčí. Nicméně narazil jsem na problém, který
se mi nepodařilo zatím nikde vygůglit a ani zjistit, proč mě to nemá rádo.
Co mám: hierarchii tříd, kde základní je abstraktní (a dle návodů snad i řádně
oanotovaná):
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true,
defaultImpl = AccountBank.class
)
@JsonSubTypes({
@JsonSubTypes.Type(value = AccountBank.class, name=AccountBank.TYPE_NAME),
@JsonSubTypes.Type(value = AccountCash.class, name=AccountCash.TYPE_NAME),
@JsonSubTypes.Type(value = AccountCreditCard.class,
name=AccountCreditCard.TYPE_NAME)
})
public abstract class Account implements Serializable {
.....
}
a k tomu v tom samém balíčku zmíněné tři třídy. Restová metoda
@Path("/{userId}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Account get(@PathParam("userId") String userId)
vrátí json se správnými údaji vlastními skutečnému vracenému objektu, kromě
políčka "type".
A metoda
@Path("/{userId}")
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public void create(@PathParam("userId") String userId, Account account)
mě rovnou seřve (ať pošlu json s "type" nebo bez) následující hláškou:
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct
instance of services.ws.rs.v1.domain.Account, problem: abstract types can only
be instantiated with additional type in
formation
at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@41408365; line: 1,
column: 1]
at
org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
[jackson-mapper-asl-1.9.12.jar:1.9.12]
at
org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:233)
[jackson-mapper-asl-1.9.12.jar:1.9.12]
at
org.codehaus.jackson.map.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:60)
[jackson-mapper-asl-1.9.12.jar:1.9.12]
at
org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
[jackson-mapper-asl-1.9.12.jar:1.9.12]
at
org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
[jackson-mapper-asl-1.9.12.jar:1.9.12]
at
org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
at
org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.readFrom(AbstractReaderInterceptorContext.java:59)
[resteasy-jaxrs-3.0.4.Final.jar:
Máte někdo radu, co jsem (ne)udělal, že mi to ne(de)serializuje správné potomky?
Díky
Jirka