我在Oracle Weblogic 10.3.6上运行Dozer 5.3.2时遇到问题。 如果我在容器中运行Dozer,则发生异常。 在我的JUnit测试中,推土机工作正常。
java.lang.IllegalArgumentException
oracle.xml.jaxp.JXDocumentBuilderFactory.setAttribute(JXDocumentBuilderFactory.java:147)
weblogic.xml.jaxp.RegistryDocumentBuilderFactory.setAttribute(RegistryDocumentBuilderFactory.java:176)
org.dozer.loader.xml.XMLParserFactory.createDocumentBuilderFactory(XMLParserFactory.java:56)
org.dozer.loader.xml.XMLParserFactory.createParser(XMLParserFactory.java:35)
org.dozer.loader.xml.MappingFileReader.<init>(MappingFileReader.java:46)
org.dozer.loader.CustomMappingsLoader.<init>(CustomMappingsLoader.java:52)
org.dozer.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:212)
org.dozer.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:186)
org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:111)
myProject.myObject.MyDefaultMapper.map(MyDefaultMapper.java:23)
myProject.myObject.mapToClientDS(XYZService.java:162)
myProject.myObject.read(XYZService.java:42)
myProject.myObject.search(MyController.java:64)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sun.el.parser.AstValue.invoke(Unknown Source)
com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
oracle.adf.controller.internal.util.ELInterfaceImpl.invokeMethod(ELInterfaceImpl.java:173)
....
weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
问题似乎是org.dozer.loader.xml.XMLParserFactory
中的方法:
private DocumentBuilderFactory createDocumentBuilderFactory() { DocumentBuilderFactory
factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
factory.setIgnoringElementContentWhitespace(true);
factory.setAttribute(SCHEMA_FEATURE, true); // For Xerces implementation
return factory; }
此方法设置factory.setAttribute(SCHEMA_FEATURE, true)
。 Oracle实现不支持属性SCHEMA_FEATURE
并抛出IllegalArgumentException
,包括以下堆栈跟踪:
oracle.xml.jaxp.JXDocumentBuilderFactory.setAttribute(JXDocumentBuilderFactory.java:147)
weblogic.xml.jaxp.RegistryDocumentBuilderFactory.setAttribute(RegistryDocumentBuilderFactory.java:176)
我也尝试用Xerces替换JAXP的oracle实现。我通过在<prefer-web-inf-classes>true</prefer-web-inf-classes>
中配置WEB-INF/weblogic.xml
并将Xerces库添加到已部署的库中来完成此操作。但是,如果我在部署应用程序时尝试替换异常后收到的库。我尝试过Xerces 2.11.0(JAXP 1.4)和Xerces 2.9.1(JAXP 1.3,它应该是Weblogic 10.3.6的正确替代品)。 (xercesImpl.jar
,xml-apis.jar
)
Caused By: java.lang.NoSuchMethodError:
org.apache.xerces.impl.xpath.regex.RegularExpression.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)V at
org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl.applyFacets(Unknown Source) at
org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl.applyFacets1(Unknown Source) at
org.apache.xerces.impl.dv.xs.BaseSchemaDVFactory.createBuiltInTypes(Unknown Source) at
org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl.createBuiltInTypes(Unknown Source) at
org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl.<clinit>(Unknown Source) Truncated. see log file for complete stacktrace
如果您查看org.apache.xerces.impl.xpath.regex.RegularExpression的源代码,您会看到RegularExpression在版本2.11.0中有以下ctors:
(String a)
(String b, String d)
(String c, String f, Locale l)
(String d, Token t, int p, boolean h, int o)
RegularExpression在版本2.9.1中有以下ctors:
(String a)
(String b, String d)
(String c, Token t, int p, boolean h, int o)
所以我无法解释为什么两个版本都会发生异常。
我还尝试通过配置<prefer-application-packages> <package-name>org.apache.xerces.*<package-name>
来配置由过滤器类加载器加载的xerces,但由于实现混淆,导致ClassCastException
s。
我希望有人可以帮我在WebLogic 10.3.6上运行Dozer。
此致
最高
答案 0 :(得分:0)
我遇到了类似的情况。
我还没有找到更好的方法但删除文件javax.xml.parsers.DocumentBuilderFactory 在你的jar文件中,META-INF可以使它工作。 但也许会引起另一个问题。
答案 1 :(得分:0)
更改类加载顺序可以解决问题。添加文件weblogic-application.xml以及下一个内容:
<prefer-application-packages>
<package-name>org.dozer.*</package-name>
<package-name>org.apache.*</package-name>
<package-name>antlr.*</package-name>
</prefer-application-packages>