spring-projects / spring-framework

Spring Framework
https://spring.io/projects/spring-framework
Apache License 2.0
56.22k stars 37.98k forks source link

cannot use JDBC Datasource with collection-typed report parameters [SPR-4917] #9592

Closed spring-projects-issues closed 12 years ago

spring-projects-issues commented 16 years ago

Donal Murtagh opened SPR-4917 and commented

I have the following Jasper report view configured:

\ \ \ \

The report data is retrieved via an SQL statement contained within the report template, so I've set the "jdbcDataSource" property above and do not add any attributes to the model data of type JRDatasource. The relevant controller code is:

public ModelAndView getTransactionReport(HttpServletRequest request, HttpServletResponse response, TransactionReportCommand command) {

ModelAndView mav = new ModelAndView("transactionReport");

// Add a parameter that indicates which format should be produced by JasperReportsMultiFormatView
Map<String, Object> reportParams = new HashMap<String, Object>();
reportParams.put("format", command.getFormat());

// Supply values for the Jasper report parameters. The name and type of each model attribute must match the corresponding
// report parameter used in the Jasper .jrxml file
reportParams.put("grouping", command.getGrouping().getCode());
reportParams.put("startDate", command.getStartDate());
reportParams.put("endDate", command.getEndDate());

// These optional params are defined as type java.util.Collection wihin the Jasper report 
reportParams.put("campaignId", Collections.singleton(command.getCampaignId()));
reportParams.put("partnerId", Collections.singleton(command.getPartnerId()));
reportParams.put("merchantId", Collections.singleton(command.getMerchantId()));
reportParams.put("affiliateId", Collections.singleton(command.getAffiliateId()));

mav.addAllObjects(reportParams);
return mav;

}

At runtime I get the exception appended to the end of this message. It seems that Spring is trying to use one of the Collection-typed attributes as the report's datasource, but doesn't know which one of the four to use. However, I've already indicated that I'm using a JDBC datasource, so I don't understand why it is looking anywhere in the model attributes for the report data. Is this a bug or am I missing something?

I've also tried adding the javax.sql.DataSource to the model attributes and removing the "jdbcDataSource" property configured in views.xml, but this doesn't appear to work either.


Affects: 2.5.4

spring-projects-issues commented 16 years ago

Donal Murtagh commented

Sorry, I forgot the stack trace:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArg umentException: More than one value of type [java.util.Collection] found at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:488) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:441) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.onebigplanet.web.filter.CachingFilter.doFilter(CachingFilter.java:143) at net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:92) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.onebigplanet.web.filter.SecuredFilter.doFilter(SecuredFilter.java:59) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:437) at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:381) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595) Caused by: java.lang.IllegalArgumentException: More than one value of type [java.util.Collection] found at org.springframework.util.CollectionUtils.findValueOfType(CollectionUtils.java:220) at org.springframework.util.CollectionUtils.findValueOfType(CollectionUtils.java:242) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.getReportData(AbstractJasperRepo rtsView.java:724) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.fillReport(AbstractJasperReports View.java:636) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.renderMergedOutputModel(Abstract JasperReportsView.java:572) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)

spring-projects-issues commented 16 years ago

Juergen Hoeller commented

I have addressed this for Spring 2.5.5 now, as part of a general revision of AbstractJasperReportsView's report data handling.

This should be available in tonight's 2.5.5 snapshot (http://static.springframework.org/downloads/nightly/snapshot-download.php?project=SPR). Feel free to give it an early try...

Juergen

spring-projects-issues commented 16 years ago

Donal Murtagh commented

Thanks very much. I'll try out the snapshot this week and let you know how it goes. Could you give me an approximate date for the release of 2.5.5? BTW, there's no information in the official reference guide about how to configure Spring to work with a report in which the SQL is contained within the report itself. I think this is fairly common, so it might be worth adding a few lines mentioning the existence of the "jdbcDataSource" property.

spring-projects-issues commented 16 years ago

Juergen Hoeller commented

2.5.5 is already overdue - it was scheduled for release last week...

It is going to be released Monday next week now, as far as I can currently estimate. Hence any feedback coming in this week will be highly appreciated since it allows us to double-check that everything will be fine for the actual public release!

Juergen

spring-projects-issues commented 16 years ago

Donal Murtagh commented

I tested the build of 2008-06-18 (yesterday) and it works like a charm - take a bow! Thanks for the speedy resolution.

spring-projects-issues commented 16 years ago

Donal Murtagh commented

Sorry, I may have spoken too soon. Although it now locates the datasource, when I try to actually supply a value for one of the collection-typed parameters, I get the exception shown at the end of the post. This happens after I return the ModelAndView from my controller method, so it's difficult for me to debug into the cause of the problem - sorry. I realise it's probably not much easier for you, so please let me know if there's anything I can do to help, e.g. supply a copy of the report and the relevant code, Feel free to IM me if you think that would be easier, if you have an MSN compatible chat client you get me at

domurtag_AT_yahoo_DOT_co_DOT_uk

2008-06-19 16:00:08,354 WARN [net.sf.ehcache.constructs.web.filter.Filter] Throwable thrown during doFilter on request with URI: /obp/admin/report/transactionReport and Query: nullRequest processing failed; nested exception is net.sf.jaspe rreports.engine.JRException: Error retrieving field value from bean : id org.springframework.web.util.NestedServletException: Request processing failed; nested exception is net.sf.jasperreports .engine.JRException: Error retrieving field value from bean : id at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:488) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:441) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.onebigplanet.web.filter.CachingFilter.doFilter(CachingFilter.java:143) at net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:92) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.onebigplanet.web.filter.SecuredFilter.doFilter(SecuredFilter.java:59) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:437) at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:381) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595) Caused by: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : id at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:127) at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:100) at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:104 ) at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:787) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:751) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1422) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:111) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:879) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:801) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.fillReport(AbstractJasperReports View.java:642) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.renderMergedOutputModel(Abstract JasperReportsView.java:572) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476) ... 29 more Caused by: java.lang.NoSuchMethodException: Unknown property 'id' at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1122) at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:686) at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715) at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290) at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:115) ... 46 more 2008-06-19 16:00:08,372 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/obp].[spring]] Servlet.s ervice() for servlet spring threw exception java.lang.NoSuchMethodException: Unknown property 'id' at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1122) at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:686) at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715) at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290) at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:115) at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:100) at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:104 ) at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:787) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:751) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1422) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:111) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:879) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:801) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.fillReport(AbstractJasperReports View.java:642) at org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView.renderMergedOutputModel(Abstract JasperReportsView.java:572) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:441) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.onebigplanet.web.filter.CachingFilter.doFilter(CachingFilter.java:143) at net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:92) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.onebigplanet.web.filter.SecuredFilter.doFilter(SecuredFilter.java:59) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:437) at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:381) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595)