문제

우리가 경험하고 있는 대단히 하드를 추적하는 문제는 우리가 보고 있는 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();
    }
  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top