下面附带的代码产生偶发的测试失败(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();
}
答案 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();
}
了解更多信息: