问题描述
您好,我在更新org.springframework.ws后遇到Jboss EAP 6.x的问题-spring-xml
在我的项目中,我在2.7.2版中使用了Xalan,现在我想将org.springframework.ws-spring-xml从2.4.0版更新到2.4.4,并在Jboss EAP 6.x上上传我的应用程序的war
部署时出现错误:
造成原因:java.lang.IllegalArgumentException:不支持:org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)上的 (__TransformerFactory.java:169)[jboss-modules.jar:1.3.5.Final-redhat-1]在org.springframework.xml.transform.TransformerFactoryUtils.defaultSettings(TransformerFactoryUtils.java:56)[spring-xml-2.4。 4.org.springframework.xml.transform.TransformerFactoryUtils.newInstance(TransformerFactoryUtils.java:32)的[RELEASE.jar:] [org.springframework.ws.server.endpoint的spring-xml-2.4.4.RELEASE.jar:]。 .mapping.PayloadRootAnnotationMethodEndpointMapping。(PayloadRootAnnotationMethodEndpointMapping.java:58)[spring-ws-core-2.4.4.RELEASE.jar:] ...还有31个
经过快速调查,我发现在spring-xml 2.4.4版中,这是新的TransformerFactoryUtils,它使用与Xalan相同的软件包中的TransformerFactory,这导致类加载器出现问题。
我尝试遵循 以及解决方案,但是这两种方法都不适合我。
我还在redhat网站上找到了一些解决方案: : 但没有订阅,我没有访问权限...
和一个面临同样的问题? 在这种情况下也许有一些可行的解决方案? 预先感谢。
1楼
即使对于JBoss EAP 7.2我也有同样的问题
由于JBoss可以在JDK 6、7和8上运行,因此,所包含的Xalan不支持ACCESS_EXTERNAL_DTD
因为它是在JDK 7中添加的。
您可以强制的JBoss使用的TransformerFactory从Oracle JDK 8设置变量transformerFactoryClass
到com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
。
请参阅下面的快照。
final Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
final WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri(uri);
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
try {
logger.debug("Getting class for name: {}", transformerFactoryClass);
final Class<?> clazz = Class.forName(transformerFactoryClass);
Assert.isAssignable(TransformerFactory.class, clazz, "Must be instance of Class<? extends TransformerFactory>");
webServiceTemplate.setTransformerFactoryClass((Class<? extends TransformerFactory>) clazz);
} catch (ClassNotFoundException e) {
logger.error("Unable to get class for name: {}", transformerFactoryClass);
throw new IllegalArgumentException(e);
}