2012-07-10 74 views
3

在Oracle Weblogic 10.3.6上运行Dozer 5.3.2时出现问题。 如果在异常发生后我在容器中运行Dozer。 在我的JUnit测试中,推土机工作正常。Oracle Weblogic 10.3.3上的Dozer 5.3.2

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 Oracle里的实现JAXP的。我通过在WEB-INF/weblogic.xml中配置<prefer-web-inf-classes>true</prefer-web-inf-classes>并将Xerces库添加到部署的库中来完成此工作。但是如果我尝试替换部署应用程序时收到以下异常的库。我尝试过Xerces 2.11.0(JAXP 1.4)和Xerces 2.9.1(JAXP 1.3,它应该是Weblogic 10.3.6的正确替代品)。 (xercesImpl.jarxml-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 

F你在org.apache.xerces.impl.xpath.regex.RegularExpression的源代码看你会看到,正则表达式有以下构建函数在2.11.0版本:

(String a) 
(String b, String d) 
(String c, String f, Locale l) 
(String d, Token t, int p, boolean h, int o) 

正则表达式有以下的2.9.1版本构造函数:

(String a) 
(String b, String d) 
(String c, Token t, int p, boolean h, int o) 

所以我不能unterstand为什么发生异常的两个版本。

我也尝试过配置xerces,以便通过配置<prefer-application-packages> <package-name>org.apache.xerces.*<package-name>来配置过滤器类加载器,但结果是ClassCastException,因为实现混淆了。

我希望有人能够帮助我在WebLogic 10.3.6上运行Dozer。

问候,

最大

回答

0

我来到了类似的情况。

我还没有发现任何更好的办法,但删除文件javax.xml.parsers.DocumentBuilderFactory中 在JAR文件的META-INF使它发挥作用。 但也许会导致另一个问题。

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>