JAXP - XSLT спорадические сбои теста

Приведенный ниже код вызывает отдельные тестовые сбои (JUnit), работает в 80% случаев. Я использую статический объект Templates. В случае сбоя объект JAXB, отличный от ожидаемого, помещается в 'result' из вызова метода transformer.transform(jaxbSource, 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 ответ

Решение

Поскольку у вас есть несколько классов, сопоставленных с одним и тем же именем корневого элемента, вам нужно передать тип, который вы хотите разархивировать, в качестве параметра операции 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();
}

Для дополнительной информации:

Другие вопросы по тегам