JAXP - XSLT спорадические сбои теста - PullRequest
2 голосов
/ 11 марта 2011

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

1 голос
/ 14 марта 2011

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

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

...