2015-04-19 2 views
3

J'ai une classe simple qui utilise un modèle de générateur.Désérialisation de Jackson avec un modèle de générateur: "La méthode de construction a un mauvais type de retour, non compatible avec le type POJO"

public class Foo implements FooInterface { 
    ..... 
    public static final class Builder { 
    public Builder setValueA(String value) {...} 
    public Builder setValueB(String value) {...} 
    public FooInterface build() {...} 
    } 
} 

Notez que ma méthode Builder.build() retourne en fait un objet du type d'interface et non du type mis en œuvre. Je MIXIN puis annotations (parce que la classe Foo est en fait une classe 3ème partie) pour définir les sous types de FooInterface d'interface comme ceci:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = Foo.class, name = "foo")}) 
public abstract class FooInterfaceMixin {} 

Et mixin pour définir le modèle de constructeur de classe Foo, comme ceci:

@JsonTypeName("foo") 
@JsonDeserialize(builder=Foo.Builder.class) 
public abstract class FooMixin {} 

Enfin, désérialiser, je fais:

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixIn(FooInterface.class, FooInterfaceMixin.class); 
mapper.addMixIn(Foo.class, FooMixin.class); 

final String jsonString = "{\"type\":\"foo\", \"valueA\":\"a\", \"valueB\":\"b\"}"; 
FooInterface foo = mapper.readValue(jsonString, FooInterface.class); 

Je reçois l'erreur méthode build « Foo $ # Builder build (0 par ms) a un mauvais type de retour (FooInterface), non compatible avec le type POJO (Foo)

Il ressemble à this est le coupable, mais je ne comprends pas pourquoi le retour d'un super type dans une méthode de construction ne sera pas acceptable . Des idées?

Répondre

1

Cela ressemble à un bug Jackson. J'ai signalé un problème: https://github.com/FasterXML/jackson-databind/issues/761

+0

Merci Alexey. C'est utile. Pas assez de réputation pour augmenter votre réponse, mais merci. –

+0

Merci d'avoir signalé ce problème, correction du bug! Sera en 2.5.3 une fois que cela sortira. – StaxMan