Apache FOP ClassNotFoundException / ClassCircularityError在Weblogic11g上

时间:2013-03-18 08:25:41

标签: spring weblogic classloader apache-fop

我正在使用Apache FOP 1.1 在EJB3和Spring 3.0.6 Web应用程序中。 代码:

FopFactory fopFactory = FopFactory.newInstance();

驻留在我的班级中(从Spring MVC转换器调用)。 如果此代码在方法(类级别)之外,则会出现 java.lang.ClassNotFoundException 异常,并且 java.lang.ClassCircularityError 异常此行在方法内部。< / p>

请参阅下面的课程:

@Component public class PdfReport extends BaseReportImpl implements IPdfReport{

@Override
public void createReport(OutputStream out, ResponseData responseData) throws IOException {
    try {
        //Construct a FopFactory
        FopFactory fopFactory = FopFactory.newInstance();

        //Construct fop with desired output format
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

        //Setup JAXP using identity transformer
        TransformerFactory factory = TransformerFactory.newInstance();
        //identity transformer
        Transformer transformer = factory.newTransformer();

        //Setup input stream
        Source src = new StreamSource(new File("/resources/detailsReport.fo"));

        //Resulting SAX events (the generated FO) must be piped through to FOP
        Result res = new SAXResult(fop.getDefaultHandler());

        //Start XSLT transformation and FOP processing
        transformer.transform(src, res);

    } catch (FOPException e) {
        throw new RuntimeException("Failed creating PDF report: " + e.getMessage(), e);
    } catch (TransformerConfigurationException e) {
        throw new RuntimeException("Failed setting up transformer for PDF report: " + e.getMessage(), e);
    } catch (TransformerException e) {
        throw new RuntimeException("Failed transforming PDF report: " + e.getMessage(), e);
    } 
}    

@Override public void createReport(OutputStream out, ResponseData responseData) throws IOException { try { //Construct a FopFactory FopFactory fopFactory = FopFactory.newInstance(); //Construct fop with desired output format Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); //Setup JAXP using identity transformer TransformerFactory factory = TransformerFactory.newInstance(); //identity transformer Transformer transformer = factory.newTransformer(); //Setup input stream Source src = new StreamSource(new File("/resources/detailsReport.fo")); //Resulting SAX events (the generated FO) must be piped through to FOP Result res = new SAXResult(fop.getDefaultHandler()); //Start XSLT transformation and FOP processing transformer.transform(src, res); } catch (FOPException e) { throw new RuntimeException("Failed creating PDF report: " + e.getMessage(), e); } catch (TransformerConfigurationException e) { throw new RuntimeException("Failed setting up transformer for PDF report: " + e.getMessage(), e); } catch (TransformerException e) { throw new RuntimeException("Failed transforming PDF report: " + e.getMessage(), e); } }

但是在那条线上我得到了一个例外:

}

请帮忙!

增加: 如果我在createReport()方法之外移动 org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.ClassCircularityError: org/apache/fop/apps/FOPException at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at utils.spring.UnloadFilterBean.doFilterInternal(UnloadFilterBean.java:58) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207) at weblogic.work.ExecuteThread.run(ExecuteThread.java:176) Caused by: java.lang.ClassCircularityError: org/apache/fop/apps/FOPException at proj.report.PdfReport.createReport(PdfReport.java:37) at protocol.ResponseDataConverter.writeInternal(ResponseDataConverter.java:94) at protocol.ResponseDataConverter.writeInternal(ResponseDataConverter.java:1) at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:181) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:996) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:954) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:903) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:438) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) ... 26 more ,我会得到异常:

FopFactory fopFactory = FopFactory.newInstance();

1 个答案:

答案 0 :(得分:1)

解决方案是在eclipse文件org.eclipse.wst.common.component中添加FOP jar用于爆炸EAR文件创建。