2011-02-04 3 views
2

JAXB 클래스에 JsonTypeInfo를 주석으로 추가하여 다형 클래스를 쉽게 직렬화 할 수있었습니다. 그러나 Jersey가 연재 할 때 주석이 표시되지 않습니다. 보다 구체적으로, ObjectMapper를 사용할 때 나타나지만 자원의 반환 유형으로는 나타나지 않습니다. 저지가 Jackson과의 상호 작용에 문제가되는 것 같아서 지금 당황 스럽습니다.JsonTypeInfo가 Jersey와 함께 Jackson을 사용할 때 직렬화하지 않습니다.

디버깅하기 위해 저지 샘플의 jsonfromjaxb 예제를 사용하여 문제를 지역화했습니다. 클래스를 @class로 직렬화하도록하기 위해 다음을 Flight 클래스에 추가했습니다.

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") 

나는 자원에서 사용할 수있는 다음과 같은 방법 그냥 JAXB 객체를 반환 한 수동 질의/jsonfromjaxb/항공편의

@GET 
@Produces({"application/json"}) 
public synchronized Flights getFlightList() { 
    return myFlights; 
} 

@GET 
@Path("/object_mapper") 
@Produces({"application/json"}) 
public synchronized String getFlights() throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.writeValueAsString(myFlights); 
} 

결과 ObjectMapper를 사용 하나가

{"flight":[{"flightId":"OK123","company":"Czech Airlines","number":123,"aircraft":"B737"},{"flightId":"OK124","company":"Czech Airlines","number":124,"aircraft":"AB115"}]} 

쿼리 결과/jsonfromjaxb/flights/object_mapper

{"@class":"com.sun.jersey.samples.jsonfromjaxb.jaxb.Flights","flight":[{"number":123,"company":"Czech Airlines","aircraft":"B737","flightId":"OK123"},{"number":124,"company":"Czech Airlines","aircraft":"AB115","flightId":"OK124"}]} 
01 23,516,

덕분에, 랜섬

답변

0

난 당신이 잭슨 기반 직렬화 (즉, ObjectMapper를 사용 하나 사용하지 않는 것 같습니다 생각; 저수준 잭슨 생성기는 바인딩이 다르게 수행되는 것을 포함하여 대부분의 JSON 출력에 사용됩니다. 당신이 있다면, 분명히 명시 적으로 사용하는 것과 같이 보일 것입니다. 따라서 Jersey JSON 구성을 변경해야하는 것 같습니다.

+0

덕분에, 저는 디버거를 사용하여 잭슨 라이브러리를 사용하고 있는지 확인했습니다. JAXB 라이브러리가 아닌 저수준 라이브러리를 사용하는 것이 매우 유용하다는 것을 지적했습니다. 솔루션의 나머지 부분은 다음과 같습니다. –

+1

com.sun.jersey.api.json.POJOMappingFeature 사실

+0

좋아 좋은 - 나는이 점을 명심해야합니다; 나는 이것이 꽤 많은 메일 링리스트 (저지 사용자)에 대한 FAQ라고 생각한다. – StaxMan

관련 문제