2

以下に添付されているコードは、散発的なテスト失敗(JUnit)を生成し、80%の時間で機能します。静的テンプレートオブジェクトを使用しています。失敗した場合、予想とは異なるJAXBオブジェクトがtransformer.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();
}
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 に答える