XSLT ClassCastException в WebSphere, когда Spring пытается создать AnnotationMethodHandlerAdapter - PullRequest
2 голосов
/ 27 сентября 2011

При запуске WebSphere я получаю следующее исключение:

Could not instantiate bean class [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]:
Constructor threw exception; nested exception is java.lang.ClassCastException:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl incompatible with
javax.xml.transform.TransformerFactory
Caused by: java.lang.ClassCastException: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
incompatible with javax.xml.transform.TransformerFactory
    at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
    at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.<init>(AbstractXmlHttpMessageConverter.java:47)
    at org.springframework.http.converter.xml.SourceHttpMessageConverter.<init>(SourceHttpMessageConverter.java:45)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.<init>(AnnotationMethodHandlerAdapter.java:197)

Это, кажется, не имеет никакого влияния на любые bean-компоненты в моем applicationContext.xml, но это все еще странно. Для меня это выглядит так, как будто классы IBM просачиваются в мое приложение.

Как я могу это исправить? Я уже установил для параметра «Доступ к классам внутреннего сервера» значение «Ограничить».

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

Это действительно была проблема с загрузкой классов, однако ее нельзя решить, изменив настройки загрузчика классов.

Проблема заключалась в том, что файлы jml-apis и javax.xml импортировались через некоторые зависимости maven.

Поскольку мы уже установили политики загрузчика классов для приложения равными PARENT_LAST, javax.xml.transform.TransformerFactory загружался из загрузчика WebApp-Class из наших файлов jar. Однако его реализация 'com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl' исходила от загрузчика классов сервера, этот был связан с javax.xml.transform.TransformerFactory, предоставленным JDK / JRE.

Поскольку классы были загружены из разных источников, было создано исключение ClassCastException.

Удаление всех зависимостей в банках xml-apis / xerces / javax.xml решило проблему. Поскольку эти API теперь являются частью JDK, их больше не нужно импортировать.

... и если вам интересно, почему я так много знаю об этой проблеме: я работаю вместе с Аароном. ;)

0 голосов
/ 28 сентября 2011

Почему вы говорите, что классы IBM просачиваются в ваше приложение?

TransformerFactory попросили создать новый экземпляр.Далее следует последовательность шагов, чтобы определить, какой TransformerFactory использовать.Если ни один из конфигов не указан, он просто выбирает фабрику по умолчанию.

Вот javadoc для TransformerFactory: http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/TransformerFactory.html#newInstance()

Что такое ОС?Это AIX?

http://www.ibm.com/developerworks/java/jdk/aix/j664/sdkguide.aix64.html

Глядя на этот документ (ссылка выше) для AIX, он говорит мне, что это Impl по умолчанию:

javax.xml.transform.TransformerFactory Выбирает процессор XSLT.Возможные значения: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl Использовать компилятор XL TXE-J.Это значение используется по умолчанию.

Отправьте обратно дополнительную информацию, чтобы мы могли попытаться устранить ее.

HTH Manglu

0 голосов
/ 28 сентября 2011

Я не могу говорить за Ограничение, поскольку у меня нет личного опыта с ним, но я думаю, что проблема больше связана с IBM Class Loader . Класс, на который вы ссылаетесь, является частью реализации IBM TransformerFactory, и я думаю, что вы можете попробовать одно из следующих, чтобы решить эту проблему под рукой

  1. Либо измените политику загрузчика классов сервера на PARENT_LAST (Таким образом, загрузчик классов найдет класс из локального пути к классу приложения, прежде чем идти вверх по цепочке вплоть до времени выполнения Java) *
  2. Другой вариант - посмотреть файл jaxp.properties, я думаю, он находится в (was_root \ java \ jre \ lib), я читал только об этой опции, никогда не использовал его
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...