JasperReports的服务器:开关取决于用户JDBC数据源(JasperReports Ser

2019-07-17 11:57发布

任何人都可以提供关于如何做到这一点的说明? 我有几个不同的JDBC数据源设置,并希望能够配置用户运行使用不同的数据源相同的报告。 例如,当在用户A登录并运行报告A,数据源1被使用; 当在用户B登录并运行报告A,数据源2被使用。 我使用的4.0版本。

Answer 1:

我用的JasperReports Server版本6.2工作,这是完全可能的,因为用户的属性,你可以在数据源的连接设置引用这些属性。

例如,你不会为您的DB主机的一个特定的IP。 相反,你会引用用户属性(属性可以为用户定义或继承自组织或服务器本身):

host = {attribute('dbHost')}

要么

host = {attribute('dbHost', 'User')}

前者试图找到整个层次的属性(用户>组织>父组织>服务器)。 后者期望找到在用户级中定义的属性。

您可以在JasperReports服务器管理指南这里4.1节的完整说明:

http://community.jaspersoft.com/documentation/tibco-jasperreports-server-administrator-guide/v601/attributes-data-source-definitions



Answer 2:

没有在JasperReports的服务器内置的功能来做到这一点。 您需要实现一个Java扩展,将工作作为JDBC数据源的包装。 此包装将利用任一每个用户或用户对象本身选择了一个现有的连接来传递所需信息发送到数据源。 这篇文章可能是一个早期版本,但可以引导你在正确的方向。

自定义数据源一般你也可以找到在JasperReports的服务器安装样品/ customDataSource文件夹的更多细节(的JasperServer安装目录/样品)



Answer 3:

像这样的东西可以通过使用JasperReports的服务器的多租户版本来实现。 您将有2个(或以上)租赁/公司,其中用户被分配到不同的公司。 当登录的用户将只能看到属于该公司的报告/资源。 这样,你可以为每个公司不同的数据源,在每个公司的同一个报告的设置,但每个报告单位将指向相应的数据源。 如果你担心报告的重复,但共同的报告JRXML资源文件转换成可以由两家公司可以看到一个共同的文件夹(例如,在根级别),并有报告单位,是指这些作为子报表。



Answer 4:

这似乎是可能的现在,但也许不是每个用户,但每个角色更多。 所以,你可以设置一组数据源,例如用于角色管理,经理,用户,来宾,然后使用适当的数据源的用户。

开关基于用户一个DataSource -社区的JasperSoft百科

该示例示出了如何使用在JasperReports的服务器自定义数据源来切换每个用户JDBC数据源。 该示例适用于JasperReports的服务器3.5.1版本

\ WEB-INF \的applicationContext-customds.xml

  <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="SwitcherDS" class="com.jaspersoft.ps.examples.SwitchingDataSourceFactory" > <property name="repositoryService"> <ref bean="repositoryService"/> </property> <property name="dataSourceServiceFactories"> <ref bean="dataSourceServiceFactories"/> </property> </bean> </beans> 

自定义数据源要求ReportDataSourceService接口的实现

  public void setReportParameterValues(Map parameterValues) { MetadataUserDetails userDetails = (MetadataUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); String userName = userDetails.getUsername(); // obtain a connection based on the username. String dataSourceURI = "/datasources/test2"; if (userName.equalsIgnoreCase("jasperadmin")) { dataSourceURI = "/datasources/ds_1"; } connection = getRepositoryDatasource(dataSourceURI); try { parameterValues.put(JRParameter.REPORT_CONNECTION, connection.getDataSource().getConnection()); } catch (SQLException sqle){ sqle.printStackTrace(); } } 


文章来源: JasperReports Server: Switching JDBC datasources depending on user