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

Odpovedet emailem