谁能提供有关如何执行此操作的说明?我设置了几个不同的 JDBC 数据源,并希望能够配置用户使用不同的数据源运行相同的报告。例如,当用户 A 登录并运行报表 A 时,使用数据源 1;当用户 B 登录并运行报表 A 时,使用数据源 2。我使用的是 4.0 版。
4 回答
我正在使用 JasperReports Server 6.2 版,这是完全可能的,因为用户具有属性,您可以在数据源连接设置中引用这些属性。
例如,您不会为您的数据库主机设置特定的 ip。相反,您将引用用户属性(可以为用户定义属性或从组织或服务器本身继承):
host = {attribute('dbHost')}
或者
host = {attribute('dbHost', 'User')}
前者尝试在整个层次结构中查找属性(用户 > 组织 > 父组织 > 服务器)。后者期望找到在用户级别定义的属性。
您可以在JasperReports Server Admin Guide的第 4.1 节和这里找到完整的解释:
可以通过使用 JasperReports Server 的多租户版本来实现类似的功能。您将拥有 2 个(或更多)租约/公司,其中用户被分配到不同的公司。登录时,用户只会看到属于该公司的报告/资源。这样,您可以为每个公司拥有不同的数据源,在每个公司中设置相同的报告,但每个报告单元将指向各自的数据源。如果您担心报告重复,但将通用报告 JRXML 资源文件放入两个公司都可以看到的通用文件夹(例如在根级别),并让报告单元将这些称为子报告。
JasperReports Server 中没有内置功能可以执行此操作。您需要实现一个 Java 扩展,它可以作为 JDBC 数据源的包装器。此包装器将利用为每个用户选择的现有连接或用户对象本身将所需信息传递给数据源。本文可能适用于早期版本,但可以指导您朝着正确的方向前进。
您还可以在 JasperReports 服务器安装 (jasperserver-install-dir/samples) 中的示例/customDataSource 文件夹中找到有关自定义数据源的更多详细信息
现在似乎有可能,尽管可能不是每个用户,而是每个角色。因此,您可以设置一堆数据源,例如角色管理员、经理、用户、来宾,然后为用户使用适当的数据源。
基于用户切换数据源 - JasperSoft Community Wiki
此示例说明如何使用 JasperReports Server 中的自定义数据源为每个用户切换 JDBC 数据源。该示例适用于 JasperReports Server 版本 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(); } }