간헐적으로 ClassCastException 에서 ElementNSImpl 하는 자신의 유형 중에 작성된
-
22-08-2019 - |
문제
우리가 경험하고 있는 대단히 하드를 추적하는 문제는 우리가 보고 있는 ClassCastExceptions 때때로 하려고 할 때 반복의 목록 unmarshalled 개체입니다.중요한 비트 때때로, 후 재부팅이 특별한 코드의 잘 작동합니다.이것은 점에서의 방향 concurrency/타이밍/레이스 상태입니다.나는 것을 확인할 수 있도 JAXBContext 도 marshallers 및 unmarshallers 되고 동시에 사용.우리는 멀리로 직렬화들에 대한 액세스를 통해 잠그고 있습니다.
그러나 이후,우리는 실행에 OSGi 플랫폼 개인 번들을 초기화하고 비동기적으로 봄을 통해 DM 할 수 있는 2 개의 다른 번들을 만들고 JAXBContext 에서 동일한 시간입니다.
어떤 경우에는 주시면 감사하겠습니다 포인터를 향해 설명을 위해 무엇을 일으킬 수 있 이 간헐적으로 ClassCastExceptions.간헐적으로 중요하기 때문을 나타내는 이 코드 자체가 정상적으로 작동하지만 일부 외부 요인인 영향을 미치는 행위.
여기에서 특정 예를 제외(참고 제거 회사는 특정 물건):
Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to com.foobar.TunnelType
at com.foobar.NetMonitorImpl.getVpnStatus(NetMonitorImpl.java:180)
는 방법에서 선 180()를 위한 구문을 반복 이상의 컬렉션을 TunnelType 물체의 내부에는 unmarshalled 체(말 작성된 작동 BTW).
주어진 실제 물체의 작성된 잘 갔다,그것도 육체적으로 가능한 위해를 포함하여 떠나 ElementNSImpl 물체의 내부에는 중첩된 컬렉션?
Runtime environment:
- 를 포함 2.1
- OSGi
- 봄 DM
- 이 JAXBContext 이 초기화된 클래스 로더의 번들로 포함하는 클래스를 marshalled/unmarshalled
해결책 3
의 절망이 우리 동기화하기에 JAXBContext.class
체로 이것을 보고 유일한 나머지 가능성에 대한 일부의 경쟁 조건 및 적어도 우리는 할 수 없었던 재현 문제를 다시합니다.여기서 중요한 코드:
synchronized (JAXBContext.class) {
context = JAXBContext.newInstance(packageList, classLoader);
}
다른 팁
이것을 얻을 제외했을 때만을 말하는 것을 잊 JAXBContext 에 대한 모든 것-배열된 형식 될 수 있을 다루고 있습니다.
JAXBContext.newInstance(MyClass1.class,MyClass2.class, [...]);
도의 접근 방식은 여기에 제안했습니다.그러나 이 내 문제를 해결
@XmlAnyElement(lax = true)
public List<Foo> foos;
동기화된 위의 절을 확인 문제 뿐만 아니라 나를 위해,그것과 같은 맥락하지 않아야 될 지역 변수입니다.대신 그것이 있어야 인스턴스 변수,또는 고정되어 있습니다.나는 할 수 없고 리팩터링을 내 코드는 방법을 내가 다음과 같다,그래서 대신에 이동맥으로 정전 이니셜라이저는 완벽하지 않지만,작동하는 것 같다:
private static Unmarshaller um;
static{
try {
final JAXBContext ctx = JAXBContext.newInstance(ObjectFactory.class.getPackage().getName());
um = ctx.createUnmarshaller();
} catch (final JAXBException e) {
e.printStackTrace();
}
}