简体   繁体   English

创建 Spring bean 时的未知属性 accessExternalDTD

[英]Unknown attribute accessExternalDTD while creating Spring bean

I inherited an old (15 years) Java application that was maintained badly.我继承了一个维护很差的旧(15 年)Java 应用程序。 Mavenizing was not done proper so I did give it a try since a lot of libraries where manually added to the classpath. Mavenizing 没有正确完成,所以我确实试了一下,因为很多库都是手动添加到类路径中的。 Now I have a master pom that have all libraries as dependency in the pom file.现在我有一个主 pom,它在 pom 文件中将所有库作为依赖项。

The error is as below:错误如下:

Invocation of init method failed; init 方法调用失败; nested exception is java.lang.IllegalArgumentException: Unknown attribute http://javax.xml.XMLConstants/property/accessExternalDTD嵌套异常是 java.lang.IllegalArgumentException: Unknown attribute http://javax.xml.XMLConstants/property/accessExternalDTD

But now I have some parser issues while starting my webservices.但是现在我在启动我的网络服务时遇到了一些解析器问题。 The old project is using a SaxParser for XML but it also uses Spring where I see conflicts while initializing the beans.旧项目对 XML 使用 SaxParser,但它也使用 Spring,我在初始化 bean 时看到冲突。

I already upgraded to Java 8 (running also on Liberty Profile since we are bounded to IBM with an IBM JDK 8).我已经升级到 Java 8(也在 Liberty Profile 上运行,因为我们使用 IBM JDK 8 绑定到 IBM)。 Added jaxp-api to get the 'accessExternalDTD' attribute on the classpath.添加了 jaxp-api 以获取类路径上的“accessExternalDTD”属性。 Removed xerces implementation (also excluded from xalan dependencies) but nothing did work.删除了 xerces 实现(也从 xalan 依赖项中排除),但没有任何效果。

[err] JAXP: find factoryId=javax.xml.parsers.DocumentBuilderFactory
[err] JAXP: found service provider by ServiceLoader, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
2019-01-21 11:18:35 DEBUG CalculationExecutor:186 -    0.000 CalculationExecutor.new: begin

2019-01-21 11:18:35 DEBUG Loader:50 - Trying to find [project-calculationKernel.xml] using context classloader: com.ibm.ws.classloading.internal.ThreadContextClassLoader@c5d35d81.

2019-01-21 11:18:35 DEBUG Loader:56 - Found: wsjar:file:/C:/LogFiles/Tools/wlp-webProfile8-java8-win-x86_64-18.0.0.4/wlp/usr/servers/Server18.0.0.4/apps/expanded/CreditRiskWebServicesEAR.ear/CreditRiskWebServices.war/WEB-INF/lib/RiskRatingCalculation-17.0.48-SNAPSHOT.jar!/project-calculationKernel.xml

2019-01-21 11:18:35 INFO  BaseCastorMappingMarshaller:33 - Castor version used by Castor Mapping Marshaller: 1.2  [0]

2019-01-21 11:18:35 DEBUG Loader:50 - Trying to find [castorMapping-projectConfiguration.xml] using context classloader: com.ibm.ws.classloading.internal.ThreadContextClassLoader@c5d35d81.

2019-01-21 11:18:35 DEBUG Loader:56 - Found: wsjar:file:/C:/LogFiles/Tools/wlp-webProfile8-java8-win-x86_64-18.0.0.4/wlp/usr/servers/Server18.0.0.4/apps/expanded/CreditRiskWebServicesEAR.ear/CreditRiskWebServices.war/WEB-INF/lib/CalculationKernelSE-17.0.48-SNAPSHOT.jar!/castorMapping-projectConfiguration.xml

[err] JAXP: find factoryId=javax.xml.parsers.SAXParserFactory
[err] JAXP: found service provider by ServiceLoader, value=org.apache.xerces.jaxp.SAXParserFactoryImpl
[err] JAXP: find factoryId=javax.xml.parsers.SAXParserFactory
[err] JAXP: found service provider by ServiceLoader, value=org.apache.xerces.jaxp.SAXParserFactoryImpl
2019-01-21 11:18:35 DEBUG CalculationExecutor:186 -    0.00691 CalculationExecutor.new: end

[err] JAXP: find factoryId=javax.xml.parsers.DocumentBuilderFactory
[err] JAXP: found service provider by ServiceLoader, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
[err] JAXP: find factoryId=javax.xml.transform.TransformerFactory
[err] Warning: external object model net.sf.saxon.dom.DOMEnvelope has been loaded, but is not an instance of net.sf.saxon.om.ExternalObjectModel
[err] Warning: external object model net.sf.saxon.dom.DOMObjectModel has been loaded, but is not an instance of net.sf.saxon.om.ExternalObjectModel
[err] JAXP: found service provider by ServiceLoader, value=net.sf.saxon.TransformerFactoryImpl
[ERROR   ] SRVE0283E: Exception caught while initializing context: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'soapRiskApprovalService' defined in ServletContext resource [/WEB-INF/applicationContext-creditRiskWebServices.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Unknown attribute http://javax.xml.XMLConstants/property/accessExternalDTD
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1745)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$136.00000000124ED300.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:846)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:863)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:400)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:2376)
    at [internal classes]
Caused by: java.lang.IllegalArgumentException: Unknown attribute http://javax.xml.XMLConstants/property/accessExternalDTD
    at net.sf.saxon.Configuration.setConfigurationProperty(Configuration.java:2185)
    at net.sf.saxon.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:342)
    at org.springframework.xml.transform.TransformerFactoryUtils.defaultSettings(TransformerFactoryUtils.java:56)
    at org.springframework.xml.transform.TransformerFactoryUtils.newInstance(TransformerFactoryUtils.java:32)
    at org.springframework.xml.transform.TransformerHelper.newTransformerFactory(TransformerHelper.java:88)
    at org.springframework.xml.transform.TransformerHelper.getTransformerFactory(TransformerHelper.java:104)
    at org.springframework.xml.transform.TransformerHelper.createTransformer(TransformerHelper.java:119)
    at org.springframework.xml.transform.TransformerHelper.transform(TransformerHelper.java:131)
    at org.springframework.xml.transform.TransformerObjectSupport.transform(TransformerObjectSupport.java:96)
    at org.springframework.ws.wsdl.wsdl11.provider.InliningXsdSchemaTypesProvider.getSchemaElement(InliningXsdSchemaTypesProvider.java:113)
    at org.springframework.ws.wsdl.wsdl11.provider.InliningXsdSchemaTypesProvider.addTypes(InliningXsdSchemaTypesProvider.java:101)
    at org.springframework.ws.wsdl.wsdl11.ProviderBasedWsdl4jDefinition.afterPropertiesSet(ProviderBasedWsdl4jDefinition.java:234)
    at org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition.afterPropertiesSet(DefaultWsdl11Definition.java:183)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741)
    ... 15 more

I googled a lot but all I couldn't find any approach that would make this old application start up.我用谷歌搜索了很多,但我找不到任何可以启动这个旧应用程序的方法。 Hope that someone did encounter the same issues and could point me the way how to handle this.希望有人确实遇到过同样的问题,并能指出我如何处理这个问题。

Your problem seems to be related to SWS-1049 , It was introduced in spring-ws 3.0.6.RELEASE.您的问题似乎与SWS-1049 有关,它是在 spring-ws 3.0.6.RELEASE 中引入的。 you need to use 3.0.7.BUILD-SNAPSHOT instead.你需要使用 3.0.7.BUILD-SNAPSHOT 代替。

尝试从 JDK 8 设置TransformerFactory。JBoss 中存在一个问题,但代码快照应该以相同的方式工作https://stackoverflow.com/a/55304023/204950

I was facing the same issue with an old code where removing SaxonJ, or other dependencies wasn't an option.我在旧代码中遇到了同样的问题,其中删除 SaxonJ 或其他依赖项不是一种选择。

I ended up following the TransformerFactory::newInstance docs by adding a system property to define the default TransformerFactory to instantiate:我最终通过添加系统属性来定义要实例化的默认 TransformerFactory 来遵循TransformerFactory::newInstance 文档

-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

NOTE: Example is using OpenJDK8, you will have to find the TransformerFactoryImpl package that you want注意:示例使用 OpenJDK8,您必须找到所需的TransformerFactoryImpl

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM