Я занимаюсь этой проблемой. У меня есть этот класс:
public class SemaphoreResponse {
ISemaphore semaphore;
StatusHolder statusHolder;
public SemaphoreResponse() {
super();
}
// Getters and setters
}
Я хочу преобразовать свою строку json в этот класс, и он выдает мне это исключение
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.despegar.henry.automation.services.semaphoreservice.response.ISemaphore, problem: abstract types can only be instantiated with additional type information
at [Source: java.io.StringReader@17a5f5a5; line: 1, column: 2] (through reference chain: com.despegar.henry.automation.services.semaphoreservice.response.SemaphoreResponse["semaphore"])
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:233)
at org.codehaus.jackson.map.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:60)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
Итак, я понимаю, что это происходит из-за атрибута «семафор», который является интерфейсом, поэтому я знаю, что в этот интерфейс я должен добавить @JsonDeseralize вот так
@JsonDeserialize(as = [class-name].class)
public interface ISemaphore {
public abstract String getId();
public abstract void setId(String id);
public abstract String getOwnerUserId();
}
Но это моя проблема. Семафор атрибута из SemaphoreResponse не всегда использует один и тот же класс. следовательно, у меня есть два разных класса, называемых «MainSemaphore» и «ExecutionSemaphore», оба из которых реализуют интерфейс ISemaphore. Итак, во время десериализации я хочу передать класс, для которого я хочу, чтобы интерфейс адаптировался в качестве параметра.
Это было бы что-то вроде
@JsonDeserialize(as = MainSemaphore.class) or @JsonDeserialize(as = ExecutionSemaphore.class) depending the case
Как я мог это сделать? буду признателен за вашу помощь
@JsonTypeInfo
в интерфейсе; и JSON должен каким-либо образом включать идентификатор типа (либо в качестве дополнительного свойства, либо с использованием объекта-оболочки или массива, где идентификатор типа является либо ключом (для объекта), либо первым элементом (для массива). Таким образом, статья ProgrammerBruce помогает здесь. - person StaxMan   schedule 08.08.2014