JAXP - XSLT零星测试失败

时间:2011-03-11 09:39:52

标签: jaxb xslt jaxp

下面附带的代码产生偶发的测试失败(JUnit),80%的时间都有效。 我正在使用静态模板对象。在失败的情况下,不同于预期的JAXB对象被放入transform.transform(jaxbSource,result)方法调用的'result'中。

我已经尝试过锁并且徒劳地同步部分。根据规范,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();
}

1 个答案:

答案 0 :(得分:1)

由于您有多个类映射到相同的根元素名称,因此需要将要作为参数解组的类型传递给unmarshal操作。这将意味着转换为中间表示,例如:DOM,byte [],String等:

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();
}

了解更多信息: