2016-10-21 6 views
0

Я уже разместил что-то похожее, но я все еще пытаюсь обнулить мою проблему.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)

ответ

0

Смешивание связывает только аннотации; они не могут добавлять и не добавлять какие-либо поля или методы - не генерируется байт-код или манипуляция. Поэтому, пока вы можете добавлять аннотации для указания методов, которые уже существуют в целевой среде (включая статические заводские методы), должны использоваться, ничто (кроме аннотаций), определенных в mix-in, никогда не будет вызвано или не будет использовано.

+0

Не уверен, что подразумевается под «ассоциированием аннотаций». –

+0

Я не верю, что добавляю какие-либо поля или методы. Все, что я хочу, - это использовать Jackson для вызова соответствующего фабричного метода (в отличие от конструктора) каждый раз, когда он видит зарегистрированный интерфейс. У меня 646 из них в третьей стороне lib, которая не может быть изменена. Согласно этому сообщению, он должен работать [link] http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html [link] –

+0

@GeoffryRoberts, чтобы целевой класс имел соответствующий заводский метод? Если это так, это должно сработать. Я предположил, что вы ожидали, что статический метод в классе mix-in будет вызван, что не произойдет в соответствии с моим объяснением. Класс mix-in не используется AT ALL, за исключением проверки аннотаций, которые он имеет, «добавляя» те, у кого есть цель класс имеет. – StaxMan