2

下面附加的代码会产生零星的测试失败 (JUnit),在 80% 的时间里都可以正常工作。我正在使用静态模板对象。在失败的情况下,一个与预期不同的 JAXB 对象被放入来自 transformer.transform(jaxbSource, result) 方法调用的“结果”中。

我试过锁和同步部分是徒劳的。根据规范,模板对象也应该是线程安全的。转换中发生了一些奇怪的事情。

错误症状: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();
}
4

1 回答 1

1

由于您有多个类映射到相同的根元素名称,因此您需要将希望解组的类型作为参数传递给解组操作。这将意味着转换为中间表示,例如: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();
}

了解更多信息:

于 2011-03-14T17:23:59.380 回答