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();
}
Для дополнительной информации: