[英]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.