Я уже разместил что-то похожее, но я все еще пытаюсь обнулить мою проблему.Jackson mixin не называется
Спасибо за подшипник со мной.
Похоже, что Джексон не вызывает микширование, как следует, и я не могу понять, почему.
«Элемент» - это интерфейс, не являющийся классом. Обычно он создается с помощью статического заводского вызова, как показано в mixin (ниже). То, как я это понимаю, когда Джексон видит интерфейс: Element.class, он должен посмотреть вверх по mixin, а затем выполнить метод с аннотацией @JsonCreator. Ничего из этого не происходит. Если бы это было так, я бы увидел вывод из регистратора. Вместо этого, как видно из сообщения об ошибке (путь ниже), Джексон пытается обрабатывать мой интерфейс как класс и не может.
Почему мой миксин не работает?
Вот Mixin:
public class ElementMixin {
private static Logger log = LoggerFactory.getLogger(ElementMixin.class);
@JsonCreator
public static Element create() {
log.error("Element==>");
return FhirFactory.eINSTANCE.createElement();
}
}
Вот как я зарегистрировать его с картографа:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Element.class, ElementMixin.class);
Вот как я бегу вещи:
// Instantiate my interface, put some data in and serialize.
Element ela = FhirFactory.eINSTANCE.createElement();
ela.setId("CBAEL");
StringWriter writer = new StringWriter();
mapper.writeValue(writer, ela);
// Now try to deserialize into a new instance.
StringReader reader = new StringReader(writer.toString());
Element elp = mapper.readValue(reader, Element.class);//Error thrown
assertNotNull(elp);
Ошибка:
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of fhir.Element, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information at [Source: [email protected]; line: 1, column: 1] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:255) at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1007) at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:150) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3807) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2844) at gov.nist.forecast.fhir.resources.IndexResourceTest.testParametersJSON(IndexResourceTest.java:173)
Не уверен, что подразумевается под «ассоциированием аннотаций». –
Я не верю, что добавляю какие-либо поля или методы. Все, что я хочу, - это использовать Jackson для вызова соответствующего фабричного метода (в отличие от конструктора) каждый раз, когда он видит зарегистрированный интерфейс. У меня 646 из них в третьей стороне lib, которая не может быть изменена. Согласно этому сообщению, он должен работать [link] http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html [link] –
@GeoffryRoberts, чтобы целевой класс имел соответствующий заводский метод? Если это так, это должно сработать. Я предположил, что вы ожидали, что статический метод в классе mix-in будет вызван, что не произойдет в соответствии с моим объяснением. Класс mix-in не используется AT ALL, за исключением проверки аннотаций, которые он имеет, «добавляя» те, у кого есть цель класс имеет. – StaxMan