报表管理软件FineReport中weblogic类冲突报错

通过weblogic部署我方报表应用,在使用过程中可能会出现一些相关于类冲突的报错信息,这一类问题该如何解决呢?下面就通过报表管理软件FineReport来解决。

工具/原料

报表管理软件FineReport7.1.1
大小:148.2M 适用平台:windows/linux

方法/步骤

报错信息

报错1

java.lang.NoClassDefFoundError: com/sun/xml/stream/XMLReaderImpl

报错类:%weblogic_home%/bea/modules目录下的glassfish.jaxws.sjsxp_2.0.1.jar。

报错2

Weblogic8.1部署WebReport工程时的报错:

Error 500--Internal Server Error

java.lang.NoSuchMethodError: javax.xml.namespace.QName.getPrefix()Ljava/lang/String;

at com.sun.xml.stream.events.XMLEventAllocatorImpl.fillAttributes(XMLEventAllocatorImpl.java:186)

at com.sun.xml.stream.events.XMLEventAllocatorImpl.getXMLEvent(XMLEventAllocatorImpl.java:78)

at com.sun.xml.stream.events.XMLEventAllocatorImpl.allocate(XMLEventAllocatorImpl.java:54)

at com.sun.xml.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:87)

at com.fr.base.xml.XMLableReader.readXMLObject(XMLableReader.java:237)

at com.fr.report.io.core.IOHelper.generateTemplate(IOHelper.java:276)

at com.fr.report.io.TemplateImporter.generate(TemplateImporter.java:16)

at com.fr.web.core.SessionIDInfor$EmbeddedTpl.gen(SessionIDInfor.java:1568)

at com.fr.web.core.SessionDealWith.generateSessionID(SessionDealWith.java:214)

at com.fr.web.core.ReportletDealWith.dealWithReportlet(ReportletDealWith.java:35)

at com.fr.web.core.ReportDispatcher.checkAppServerConfig(ReportDispatcher.java:1183)

at com.fr.web.core.ReportDispatcher.dealWithRequest(ReportDispatcher.java:285)

at com.fr.web.ReportServlet.doGet(ReportServlet.java:169)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)

at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)

at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)

at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)

at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)

at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)

at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)

at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)

at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)

at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

报错类:jaxrpc.jar。

报错3

weblogic9部署WebReport工程时的报错:

[Fatal Error] :-1:-1: Premature end of file.

Aug 16, 2011 2:49:55 PM com.fr.base.FRContext getScheduleManager

WARNING: XML??????

com.fr.web.ReportletException: XML??????

at com.fr.base.core.BaseCoreUtils.parseXML(Unknown Source)

at com.fr.base.core.BaseCoreUtils.parseXML(Unknown Source)

at com.fr.base.XMLFileManager.readInputStreamXML(Unknown Source)

at com.fr.base.FRContext.getScheduleManager(Unknown Source)

at com.fr.web.ReportServlet.init(Unknown Source)

at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(St

ubSecurityHelper.java:278)

报错4

weblogic10.0.3或weblogic10.3.1部署WebReport工程时的报错:

java.lang.ClassCastException: com.sun.xml.stream.ZephyrParserFactory cannot be cast to javax.xml.stream.XMLInputFactory

报错类:fr-third-xx.jar

报错原因

这一类报错是由于类重用导致即类冲突,因为FineReport使用了一些第三方的插件跟weblogic里面的插件相同,但是插件版本不同(不同版本间方法的个数与实现可能不同),相同的插件只会加载一个版本,而weblogic会优先加载weblogic自身的类,如果加载了weblogic中使用的版本,当报表端使用到该第三方插件时就可能会因为找不到某些类而报如上的错误。

解决方案

解决的主要思想就是修改加载顺序,使之优先加载FineReport中的类,即使正确的jar包先于weblogic.jar加载,在%/WebReport%/WEB-INF文件夹下新建weblogic.xml配置文件,让服务器优先调用报表工程下的jar包,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">

<weblogic-web-app>

<container-descriptor>

<prefer-web-inf-classes>true</prefer-web-inf-classes>

</container-descriptor>

</weblogic-web-app>

原作者:FineReport

本文内容整理自网络, 文中所有观点看法不代表淘大白的立场