2016-10-21 7 views
0

나는 비슷한 것을 올렸지 만 여전히 문제를 제로로하려고 노력하고 있습니다.Jackson 믹스가 호출되지 않음

나를 도와 주셔서 감사합니다.

잭슨이 믹스 인을 호출하지 않아서 그 이유를 알 수없는 것처럼 보입니다.

"요소"는 클래스가 아닌 인터페이스입니다. 일반적으로 믹스 인 (아래)에 표시된 것처럼 정적 팩토리 콜을 사용하여 인스턴스화됩니다. 잭슨이 interface : Element.class를 볼 때 믹스 인을 찾아서 @JsonCreator 주석이있는 메소드를 실행해야합니다. 이 모든 일은 일어나지 않고 있습니다. 그렇다면 로거의 출력을 볼 수 있습니다. 대신, 오류 메시지 (아래)에서 볼 수 있듯이 jackson은 클래스로 내 인터페이스를 처리하려고 시도 할 수 없습니다.

왜 내 mixin이 작동하지 않습니까?

// 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); 

오류 :

다음
ObjectMapper mapper = new ObjectMapper(); 
    mapper.addMixIn(Element.class, ElementMixin.class); 

내가 실행 일 오전 방법은 다음과 같습니다 나는 매퍼에 등록하는 방법

다음
public class ElementMixin { 

     private static Logger log = LoggerFactory.getLogger(ElementMixin.class); 

     @JsonCreator 
     public static Element create() { 
      log.error("Element==>"); 
      return FhirFactory.eINSTANCE.createElement(); 
     } 
     } 

가있다 : 여기

은 믹스 인의

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

믹스 인은 주석을 연결 만합니다. 그들은 필드 나 메소드를 추가하거나 추가 할 수 없으며, 바이트 코드 생성이나 조작이 추가되지 않습니다. 따라서 주석을 추가하여 대상에 이미 존재하는 메소드 (정적 팩토리 메소드 포함)가 사용되어야 함을 나타낼 수 있지만, 믹스 인에 정의 된 아무 것도 (주석 이외에) 호출되거나 사용되지는 않습니다.

+0

"주석 연결"이 의미하는 것이 확실하지 않습니다. –

+0

필드 나 메소드를 추가한다고 생각하지 않습니다. 내가 원했던 것은 jackson이 등록 된 인터페이스를 볼 때마다 적절한 팩토리 메소드 (생성자와 반대)를 호출하는 것입니다. 나는 변경할 수없는 제 3 자 lib에 646 개가있다. 이 게시물에 따르면, 그것은 작동해야합니다 [link] http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html [link] –

+0

@GeoffryRoberts 그래서 대상 클래스가 일치하는 공장 방법을 가지고 있습니까? 그렇다면 작동합니다. 믹스 인 클래스에서 정적 메서드가 호출 될 것으로 예상했는데 내 설명대로 발생하지 않을 것입니다. 믹스 인 클래스는 AT에서 사용되는 주석을 검사하는 것 외에는 "사용되지 않습니다." 클래스가 있습니다. – StaxMan

관련 문제