2011-03-11 82 views
2

下面附带的代码会产生零星的测试失败(JUnit),可以在80%的时间内运行。 我正在使用静态模板对象。在发生故障的情况下,将不同于预期的JAXB对象置于来自transformer.transform(jaxbSource,result)方法调用的'result'中。JAXP-XSLT零星测试失败

我试过了锁,并且白白地同步了部分。另外模板对象应该根据规范是线程安全的。转换中发生了一些奇怪的事情。

错误症状: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”并且更清楚地描述“零星测试失败”的症状会很有用,理想情况下提供的数据足以让其他人重现问题。 – 2011-03-11 11:41:47

+0

是的,它与XSL样式表和测试代码的代码很相似.. – 2011-03-11 13:29:47

+1

getCachedJAXBContext()是做什么的?这可能会返回“错误”的内容?在变换之前尝试记录/打印'jaxbSource',以确保您正在改变自己的想法。 – 2011-03-11 13:51:03

回答

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

是的,我在缓存JAXBContexts之前使用了这个构造。同样的错误。 – 2011-03-16 12:09:01

+0

@Sigmund Lundgren - 你有多个具有相同@XmlRootElement注解的Java类吗?那会导致这种行为。 – 2011-03-16 12:15:43

+0

是的,我做..不同的软件包,但同名。 – 2011-03-16 13:38:14