Занимавам се с този проблем. Имам този клас:
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)
И така, разбирам, че това се случва, защото атрибутът "semaphore", който е интерфейс, така че в този интерфейс знам, че трябва да добавя @JsonDeseralize по този начин
@JsonDeserialize(as = [class-name].class)
public interface ISemaphore {
public abstract String getId();
public abstract void setId(String id);
public abstract String getOwnerUserId();
}
Но това си е мой проблем. Атрибутът semaphore от 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