2013-10-30 3 views
2

Jersey를 기반으로하고 OSGi 컨테이너 인 Geronimo3에서 실행되는 REST 웹 애플리케이션이 있습니다. 이 서비스는 Json POST 데이터로 결과를 잘 반환하고 json 출력을 Java 객체로 마샬링 할 수 있습니다. 나는 REST 클라이언트를 작성했으며, 응답 메소드를 다시 얻는 main 메소드로도 잘 동작한다.

그러나 OSGi 웹 응용 프로그램의 번들 활성화 기 클래스에서 호출 한 경우 나머지 클라이언트가 실패합니다. 이 경우 아래에 오류가 표시됩니다. 또한 웹 응용 프로그램이 완전히 초기화 될 때 나머지 클라이언트는 요청 범위에서 정상적으로 작동합니다. 나는 OSGi 클래스 로딩이 다른 정규 webapp (tomcat)이기 때문에 클래스 로더에 대한 몇 가지 문제를 의심하고있다. 또한 응답 클래스는 @JsonTypeInfo 주석을 사용하여 인터페이스 유형을 구체적인 클래스에 매핑합니다.Jackson (저지)이 예외를 역 직렬화합니다 (ID 유형 'Id.class'의 경우). 해당 클래스가 없습니다.

Caused by: java.lang.IllegalArgumentException: Invalid type id  'com.nnn.IContentValue$ContentText' (for id type 'Id.class'): no such class found 
at org.codehaus.jackson.map.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:57) 
at org.codehaus.jackson.map.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:113) 
at org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:82) 
at org.codehaus.jackson.map.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:52) 
at org.codehaus.jackson.map.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:321) 
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:249) 
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33) 
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) 

답변

3

내가 문서화하고있는 해결책을 찾았습니다.

org.codehaus.jackson.map.util.ClassUtil.findClass로 인해 발생합니다. 번들 초기화 단계에서 OSGi 번들 클래스 로더와 다른 org.eclipse.core.runtime.internal.adaptor.ContextFinder의 typeid 클래스를로드 중입니다. .

저지 클라이언트 호출을 수행하고 finally 블록에서 원래의 호출로 되돌리기 전에 Thread.currentThread(). setContextClassLoader (getClass(). getClassLoader())를 사용하여 contextClassLoader를 교체했습니다.

관련 문제