简体   繁体   English

带有Struts 2集成的DynamicJasper错误

[英]DynamicJasper with Struts 2 integration error

I am trying to integrate DynamicJasper report with Struts2 in my project. 我正在尝试将DynamicJasper报表与Struts2集成到我的项目中。 Strut2 (with XWork 2.2.1 jar) is already using JasperReports (version 4.7.1). Strut2(带有XWork 2.2.1 jar)已经在使用JasperReports(版本4.7.1)。 As per the official dynamic jasper reports documention I have added DynamicJasper (version 5.0.0) and for Struts 2 integration added the dependency DynamicJasper-Struts2 (version 1.3) the latest available version. 根据官方的动态jasper报告文档,我添加了DynamicJasper(版本5.0.0),对于Struts 2集成,添加了依赖项DynamicJasper-Struts2(版本1.3)为最新的可用版本。

I have the following error thrown during execution 我在执行过程中抛出以下错误

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)

On browsing I came across this feature request Struts 2.1.6 Compatibility ( http://sourceforge.net/p/dynamicjasper/feature-requests/4/ ) already-closed which i believe is the issue in my project, which says 在浏览时,我遇到了此功能请求Struts 2.1.6兼容性( http://sourceforge.net/p/dynamicjasper/feature-requests/4/ )已关闭,我认为这是我项目中的问题,其中说

Xwork changed method signature in version 2.1.2, we recompiled sources for that version. Xwork在2.1.2版中更改了方法签名,我们重新编译了该版本的源代码。

For better clarity, here is my code and dependencies as follows: 为了更好的说明,这是我的代码和依赖关系,如下所示:

pom.xml : 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 : 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>

In my action class, I have 在动作课上,我有

// 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";
    }

The actual class which creates the myDynamicReport is as follows, referred from Word press Dynamic Jasper Report for beginners as follows 创建myDynamicReport的实际类如下,从Word press Dynamic Jasper Report中为初学者介绍如下

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;
    }

}

The ActionContext class has the method signature ActionContext类具有方法签名

public Object get(String key)

so this is the cause of the exception and you should modify ar.com.fdvs.dj.struts2.DJStruts2Result and probably other classes that use Object type parameter or pick up a correct version. 因此,这是导致异常的原因,您应该修改ar.com.fdvs.dj.struts2.DJStruts2Result以及可能使用Object类型参数或选择正确版本的其他类。 Also your maven dependencies should correspond to the concrete version of the Struts 2 framework. 您的Maven依赖项也应对应于Struts 2框架的具体版本。 See my answer to Conflicts in xwork and xwork-core . 在xwork和xwork-core中查看我对冲突的回答。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM