我正在尝试将DynamicJasper报表与Struts2集成到我的项目中。 Strut2(带有XWork 2.2.1 jar)已经在使用JasperReports(版本4.7.1)。按照official dynamic jasper reports documention,我添加了DynamicJasper(版本5.0.0),对于Struts 2集成,添加了依赖项DynamicJasper-Struts2(版本1.3)为最新可用版本。

我在执行过程中抛出以下错误

org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/proj] threw exception [Filter execution threw an exception] with root cause
java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.get(Ljava/lang/Object;)Ljava/lang/Object;
    at ar.com.fdvs.dj.struts2.DJStruts2Result.doExecute(DJStruts2Result.java:138)
    at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)


在浏览时,我遇到了此功能请求Struts 2.1.6 Compatibility(http://sourceforge.net/p/dynamicjasper/feature-requests/4/)已关闭,我认为这是我项目中的问题,其中说


  Xwork在版本2.1.2中更改了方法签名,我们重新编译了源代码
  对于该版本。


为了更好的说明,这是我的代码和依赖关系,如下所示:

pom.xml

<repository>
  <id>fdvsolution.public</id>
  <url>http://archiva.fdvs.com.ar/repository/public1/</url>
</repository>

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.1.8</version>
</dependency>
<dependency>
    <groupId>org.apache.struts.xwork</groupId>
    <artifactId>xwork-core</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.1.8</version>
</dependency>
<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>4.7.1</version>
</dependency>
<dependency>
    <groupId>ar.com.fdvs</groupId>
    <artifactId>DynamicJasper</artifactId>
    <version>5.0.0</version>
</dependency>
<dependency>
    <groupId>ar.com.fdvs</groupId>
    <artifactId>DynamicJasper-Struts2</artifactId>
    <version>1.3</version>
</dependency>


struts.xml

<result-types>
    <result-type name="jasper" class="com.orgn.appl.util.JasperReportsResult" />
    <result-type name="dynamic-jasper" class="ar.com.fdvs.dj.struts2.DJStruts2Result" />
</result-types>

<action name="actnReport" class="reportAction" method="actnReport">
    <result name="success" type="tiles">reports.tiles</result>
    <result name="allReport">reports/allReport.jsp</result>
    <result name="showDynaReport" type="dynamic-jasper">
        <param name="dynamicReport">myDynamicReport</param>
        <param name="layoutManager">classic</param>
            <param name="parameters">paramMap</param>
        <param name="contentType">text/html</param>
        <param name="format">HTML</param>
    </result>
</action>


在动作课上,我有

// with getters and setters
private DynamicReport myDynamicReport = new DynamicReport();
private Map paramMap = new HashMap();

public String actnReport() throws ColumnBuilderException, JRException, ClassNotFoundException{

        LOG.debug("showDynaReport");

        myDynamicReport = DynamicJasper.myReport(); //I am getting the dynamic Report object from here
        LOG.debug("myDynamicReport----->"+myDynamicReport.getReportName());

        Object[] obj = new Object[3];
        obj[0] = new DynamicDemoBean(
                100.00f,
                "San Jose",
                200,
                "Tojo",
                "Vintage 2000",
                50,
                "CA",
                "Tojo is a finer variety of wine produced from the California wine yards. It has been produced to the industry standards. Tojo is a finer variety of wine produced from the California wine yards. It has been produced to the industry standards.");

        obj[1] = new DynamicDemoBean(
                110f,
                "San Jose",
                120,
                "Spinster",
                "Vintage 2000",
                50,
                "CA",
                "Spinster is a finer veriety of wine produced from the California wine yards. It has been produced to the industy standards.");

        obj[2] = new DynamicDemoBean(
                120.00f,
                "Down Town",
                220,
                "Royal",
                "Vintage 2000",
                50,
                "CA",
                "Royal is a finer veriety of wine produced from the California wine yards. It has been produced to the industy standards.");

        paramMap.put(0, obj[0]);
        paramMap.put(1, obj[1]);
        paramMap.put(2, obj[2]);


        LOG.debug("paramMap----->"+paramMap.size());
        return "showDynaReport";
    }


创建myDynamicReport的实际类如下,从Word press Dynamic Jasper Report for beginners引用如下

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRPrintPage;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.export.JExcelApiExporterParameter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import ar.com.fdvs.dj.core.DynamicJasperHelper;
import ar.com.fdvs.dj.core.layout.ClassicLayoutManager;
import ar.com.fdvs.dj.domain.DynamicReport;
import ar.com.fdvs.dj.domain.ImageBanner;
import ar.com.fdvs.dj.domain.Style;
import ar.com.fdvs.dj.domain.builders.ColumnBuilder;
import ar.com.fdvs.dj.domain.builders.ColumnBuilderException;
import ar.com.fdvs.dj.domain.builders.FastReportBuilder;
import ar.com.fdvs.dj.domain.constants.Border;
import ar.com.fdvs.dj.domain.constants.Font;
import ar.com.fdvs.dj.domain.constants.HorizontalAlign;
import ar.com.fdvs.dj.domain.constants.Transparency;
import ar.com.fdvs.dj.domain.constants.VerticalAlign;
import ar.com.fdvs.dj.domain.entities.columns.AbstractColumn;

public class DynamicJasper {

    public static DynamicReport myReport() throws ColumnBuilderException, JRException, ClassNotFoundException{

        // build report
        Style headerStyle = getHeaderStyle();
        Style detailStyle = new Style();
        detailStyle.setBorder(Border.THIN());

        // build first report
        FastReportBuilder firstReport = getFirstReport(headerStyle, detailStyle);
        DynamicReport firstDynaRep = firstReport.build();

        System.out.println("Returned Dynamic Reports");
        return firstDynaRep;
    }

    private static Style getHeaderStyle() {
        Style headerStyle = new Style();
        headerStyle.setFont(Font.ARIAL_MEDIUM_BOLD);
        headerStyle.setBorderBottom(Border.PEN_2_POINT());
        headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        headerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
        headerStyle.setBackgroundColor(Color.LIGHT_GRAY);
        headerStyle.setTextColor(Color.BLUE);
        headerStyle.setTransparency(Transparency.OPAQUE);
        return headerStyle;
    }

    private static AbstractColumn getColumn(String property, Class type, String title, int width, Style headerStyle, Style detailStyle) throws ColumnBuilderException {
        AbstractColumn columnState = ColumnBuilder.getInstance()
                .setColumnProperty(property, type.getName()).setTitle(title)
                .setWidth(Integer.valueOf(width)).setStyle(detailStyle)
                .setHeaderStyle(headerStyle).build();
        return columnState;
    }

    private static FastReportBuilder getFirstReport(Style headerStyle, Style detailStyle) throws ColumnBuilderException, ClassNotFoundException {

        FastReportBuilder firstReport = new FastReportBuilder();
        AbstractColumn columnState = getColumn("state", String.class, "State", 30, headerStyle, detailStyle);
        AbstractColumn columnBranch = getColumn("branch", String.class, "Branch", 30, headerStyle, detailStyle);
        AbstractColumn columnProductLine = getColumn("productLine", String.class, "Product Line", 50, headerStyle, detailStyle);
        AbstractColumn columnItem = getColumn("item", String.class, "Item", 50, headerStyle, detailStyle);
        AbstractColumn columnaItemCode = getColumn("itemCode", Long.class, "Item Code", 22, headerStyle, detailStyle);
        AbstractColumn columnQuantity = getColumn("quantity", Long.class, "Quantity", 22, headerStyle, detailStyle);
        Style amountStyle = new Style();
        amountStyle.setHorizontalAlign(HorizontalAlign.RIGHT);
        AbstractColumn columnAmount = ColumnBuilder.getInstance()
                .setColumnProperty("amount", Float.class.getName())
                .setTitle("Amount").setWidth(Integer.valueOf(30))
                .setStyle(amountStyle).setPattern("$ 0.00")
                .setStyle(detailStyle).setHeaderStyle(headerStyle).build();

        AbstractColumn remarks = getColumn("remarks", String.class, "Remarks", 100, headerStyle, detailStyle);
        firstReport.addColumn(columnState).addColumn(columnBranch)
                .addColumn(columnProductLine).addColumn(columnItem)
                .addColumn(columnaItemCode).addColumn(columnQuantity)
                .addColumn(columnAmount).addColumn(remarks);

        firstReport.addFirstPageImageBanner("E:\\DynamicJasperReports\\fdvsolutions_dynamicjasper_project.png",Integer.valueOf(560), Integer.valueOf(51),ImageBanner.ALIGN_LEFT);
        firstReport.setTitle("November 2006 sales report");
        firstReport.setSubtitle("This report was generateed at");
        firstReport.setUseFullPageWidth(true); // make colums to fill the page width

        return firstReport;
    }

    private static FastReportBuilder getSecondReport(Style headerStyle, Style detailStyle) throws ColumnBuilderException {

        FastReportBuilder secondReport = new FastReportBuilder();

        AbstractColumn columnState = getColumn("state", String.class, "State", 30, headerStyle, detailStyle);
        AbstractColumn columnBranch = getColumn("branch", String.class, "Branch", 30, headerStyle, detailStyle);
        AbstractColumn columnProductLine = getColumn("productLine", String.class, "Product Line", 50, headerStyle, detailStyle);
        AbstractColumn columnItem = getColumn("item", String.class, "Item", 50, headerStyle, detailStyle);
        AbstractColumn columnaItemCode = getColumn("itemCode", Long.class, "Item Code", 22, headerStyle, detailStyle);
        AbstractColumn columnQuantity = getColumn("quantity", Long.class, "Quantity", 22, headerStyle, detailStyle);
        Style amountStyle = new Style();
        amountStyle.setHorizontalAlign(HorizontalAlign.RIGHT);
        AbstractColumn columnAmount = ColumnBuilder.getInstance()
                .setColumnProperty("amount", Float.class.getName())
                .setTitle("Amount").setWidth(Integer.valueOf(30))
                .setStyle(amountStyle).setPattern("$ 0.00")
                .setStyle(detailStyle).setHeaderStyle(headerStyle).build();

        AbstractColumn remarks = getColumn("remarks", String.class, "Remarks", 100, headerStyle, detailStyle);
        secondReport.addColumn(columnState);
        secondReport.addColumn(columnBranch);
        secondReport.addColumn(columnProductLine);
        secondReport.addColumn(columnItem);
        secondReport.addColumn(columnaItemCode);
        secondReport.addColumn(columnQuantity);
        secondReport.addColumn(columnAmount);
        secondReport.addColumn(remarks);

        secondReport.addFirstPageImageBanner("E:\\DynamicJasperReports\\fdvsolutions_dynamicjasper_project.png", Integer.valueOf(560), Integer.valueOf(51), ImageBanner.ALIGN_LEFT);
        secondReport.setTitle("December 2006 sales report");
        secondReport.setSubtitle("This report was generateed at");
        secondReport.setUseFullPageWidth(true); // make colums to fill the page width

        return secondReport;
    }

}

最佳答案

ActionContext类具有方法签名

public Object get(String key)


因此这是导致异常的原因,您应该修改ar.com.fdvs.dj.struts2.DJStruts2Result以及可能使用Object类型参数的其他类或选择正确的版本。您的Maven依赖项也应对应于Struts 2框架的具体版本。参见我对Conflicts in xwork and xwork-core的回答。

10-06 12:42