2012-12-21 34 views
1

任何人都可以提供有關如何執行此操作的說明?我有幾個不同的JDBC數據源設置,並希望能夠配置用戶使用不同的數據源運行相同的報告。例如。當用戶A登錄並運行報告A時,使用數據源1;當用戶B登錄並運行報告A時,使用數據源2。我正在使用4.0版本。JasperReports服務器:根據用戶切換JDBC數據源

回答

0

JasperReports服務器中沒有內置功能可以這樣做。您需要實現一個可用作JDBC數據源包裝的Java擴展。該包裝將利用爲每個用戶選擇的現有連接或用戶對象本身將所需信息傳遞給數據源。 This article可能適用於較早的版本,但可以引導您朝着正確的方向前進。自定義數據源

更多細節一般你也可以找到在JasperReports的服務器安裝樣品/ customDataSource文件夾(的JasperServer安裝目錄/樣品)

0

像這樣的東西可以通過使用多租戶實現JasperReports服務器版本。你將有2個(或更多)租戶/公司,用戶被分配到不同的公司。登錄用戶時只能看到屬於該公司的報告/資源。這樣,每個公司可以擁有不同的數據源,每個公司都有相同的報告設置,但每個報告單位都會指向相應的數據源。 如果您擔心重複報告,但將常見報告JRXML資源文件放入可由兩家公司(例如根級)看到的公用文件夾中,並讓報告單元將這些文件稱爲子報告。

0

現在看起來有可能,儘管可能不是每個用戶,但每個角色更多。所以你可以設置一堆數據源,例如對於角色admin,manager,user,guest,然後爲用戶使用適當的數據源。

Switching A DataSource Based On A User - JasperSoft Community Wiki

該實施例顯示瞭如何使用在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(); 
    } 
} 
0

我正在使用JasperReports服務器版本6.2,這是完美的因爲用戶具有屬性,並且可以在數據源連接設置中引用這些屬性。

例如,您不會爲您的數據庫主機設置特定的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

相關問題