2016-09-09 1 views
1

Я взял примерный пример кода MixedType, который поставляется с клиентом потока java (https://github.com/GetStream/stream-java), и добавил шаг обновления, используя updateActivities. После обновления активность, хранящаяся в потоке, теряет атрибут «type». Джексон использует этот атрибут, когда вы снова получаете действия, и он десериализует их.Обновление активности смешанного типа в GetStream.IO с использованием клиента потока java теряет атрибут типа

Так я получаю:

Exception in thread "main" Disconnected from the target VM, address: '127.0.0.1:60016', transport: 'socket' com.fasterxml.jackson.databind.JsonMappingException: Could not resolve type id 'null' into a subtype of [simple type, class io.getstream.client.apache.example.mixtype.MixedType$Match] at [Source: [email protected]4e3; line: 1, column: 619] (through reference chain: io.getstream.client.model.beans.StreamResponse["results"]->java.util.ArrayList[1]) at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) at com.fasterxml.jackson.databind.DeserializationContext.unknownTypeException(DeserializationContext.java:849)

Смотрите здесь, где я обновил пример:

https://github.com/puntaa/stream-java/blob/master/stream-repo-apache/src/test/java/io/getstream/client/apache/example/mixtype/MixedType.java

Любая идея, что здесь происходит?

ответ

0

Проблема здесь возникла Джексон, который не может получить фактический тип экземпляра объекта внутри коллекции из-за типа стирания Java , если вы хотите узнать больше об этом, пожалуйста, прочитайте этот вопрос: https://github.com/FasterXML/jackson-databind/issues/336 (который также предоставляет некоторые возможные обходные пути).

Самый простой способ решить эту проблему, было бы вручную заставить значение свойства type внутри подкласса, как показано в примере ниже:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true) 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value = VolleyballMatch.class, name = "volley"), 
     @JsonSubTypes.Type(value = FootballMatch.class, name = "football") 
}) 
static abstract class Match extends BaseActivity { 
    private String type; 

    public String getType() { 
     return type; 
    } 
} 

static class VolleyballMatch extends Match { 
    private int nrOfServed; 
    private int nrOfBlocked; 

    public VolleyballMatch() { 
     super.type = "volley"; 
    } 

    public int getNrOfServed() { 
     return nrOfServed; 
    } 

    public void setNrOfServed(int nrOfServed) { 
     this.nrOfServed = nrOfServed; 
    } 

    public void setNrOfBlocked(int nrOfBlocked) { 
     this.nrOfBlocked = nrOfBlocked; 
    } 

    public int getNrOfBlocked() { 
     return nrOfBlocked; 
    } 
} 

static class FootballMatch extends Match { 
    private int nrOfPenalty; 
    private int nrOfScore; 

    public FootballMatch() { 
     super.type = "football"; 
    } 

    public int getNrOfPenalty() { 
     return nrOfPenalty; 
    } 

    public void setNrOfPenalty(int nrOfPenalty) { 
     this.nrOfPenalty = nrOfPenalty; 
    } 

    public int getNrOfScore() { 
     return nrOfScore; 
    } 

    public void setNrOfScore(int nrOfScore) { 
     this.nrOfScore = nrOfScore; 
    } 
} 
Смежные вопросы