2011-03-11 2 views
2

아래에 첨부 된 코드는 산발적 인 테스트 실패 (JUnit)를 생성하며 시간의 80 %를 작동합니다. 정적 인 Templates 객체를 사용하고 있습니다. 실패의 경우, 예상되는 JAXB 오브젝트와 다른 것이 transform.transform (jaxbSource, result) 메소드 호출의 'result'에 배치됩니다.JAXP - XSLT 산발적 테스트 실패

나는 잠금을 시도하고 섹션을 헛되이 동기화합니다. 또한 Templates 객체는 사양에 따라 스레드 안전성이 있어야합니다. 변환에서 뭔가 이상한 일이 일어나고 있습니다.

오류 증상 : JUnit 테스트 오류 - 갑자기 잘못된 개체가 변환에서 반환됩니다.

아이디어가 있으십니까? 같은 루트 요소 이름에 매핑 된 여러 클래스를 가지고 있기 때문에

private <S, T> S transform(final Templates template, final Class resultClass, final T data) throws JAXBException, TransformerException { 
    Transformer transformer = template.newTransformer(); 
    final JAXBSource jaxbSource = new JAXBSource(getCachedJAXBContext(data.getClass()), data); 
    final Result result = new JAXBResult(getCachedJAXBContext(resultClass)); 
    transformer.transform(jaxbSource, result); 
    return (S) ((JAXBResult) result).getResult(); 
} 
+2

어떤 생각을. JAXB에 태그를 지정하고 "산발적 인 테스트 실패"의 증상을 설명하는 것이 유용 할 것입니다. 다른 사람들이 문제를 재현 할 수 있도록 충분한 데이터를 이상적으로 공급하는 것이 이상적입니다. –

+0

예, XSL 스타일 시트와 테스트 코드를 사용하는 꽤 많은 코드입니다. –

+1

'getCachedJAXBContext()'의 기능은 무엇입니까? 그것은 "잘못된"내용을 반환 할 수 있습니까? 변환하기 전에'jaxbSource'를 로깅/인쇄하여 자신이 생각하는 것을 변형시키고 있는지 확인하십시오. –

답변

1

, 당신은 당신이 비 정렬 화 조작에 매개 변수로 비 정렬 화하려는 유형을 통과해야합니다. 등 DOM, 바이트 [], 문자열, : :이 같은 중간 표현으로 변환하는 것을 의미하지 않습니다 자세한 내용은

private <S, T> S transform(final Templates template, final Class resultClass, final T data) throws JAXBException, TransformerException { 
    Transformer transformer = template.newTransformer(); 
    final JAXBSource jaxbSource = new JAXBSource(getCachedJAXBContext(data.getClass()), data); 
    final Result result = new DOMResult(); 
    transformer.transform(jaxbSource, result); 
    return (S) getCachedJAXBContext(resultClass).createUnmarshaller().unmarshal(new DOMSource(result.getNode()), resultClass).getValue(); 
} 

: 그 원인을 무엇

+0

예, JAXBContext를 캐싱하기 전에 해당 구성을 사용했습니다. 같은 오류. –

+0

@Sigmund Lundgren - 동일한 @XmlRootElement 주석을 가진 여러 Java 클래스가 있습니까? 그것은이 행동을 일으킬 것입니다. –

+0

예, 할 수 있습니다. 패키지는 같지만 이름은 같습니다. –