0

对于这个要求,我们尝试使用 org.wso2.carbon.user.core.util.DatabaseUtil 类通过传递领域来创建数据源,但是我们总是得到一个异常,说在查找数据源时出错。我们了解到,在服务器启动期间,org.wso2.carbon.user.core.internal.Activator -> startDeploy(BundleContext bundleContext) 被调用并创建了一个新的 RealmService 实例,其中领域配置和数据源对象已成功初始化。在 Activator 类中初始化的 realmservice 实例被设置为 UserCoreUtil class(UserCoreUtil.setRealmService(realmService))。RealmService 初始化调用 DefaultRealmService,其中初始化数据源实例并将该对象添加到属性中。

对于调用以下调用的任何与用户或租户相关的 DB 操作,调用 CarbonContext.getThreadLocalCarbonContext().getUserRealm() 方法实际上使用了在服务器启动期间由 DefaultRealmService 存储的属性中的数据源,并创建了 userStoreManager 实例并返回执行所有用户相关操作的 userRealm。

为了访问特定于应用程序的表,我们创建了自己的 JDBCCustomManager 类并尝试执行 JDBC 操作。我们需要数据源来执行数据库操作,当我们执行“DatabaseUtil.getRealmDataSource(objRealmService.getBootstrapRealmConfiguration())”时,我们总是得到一个异常“查找数据源错误:jdbc/WSO2CarbonDB”。

如果我们在 JDBCUserStoreManager 中编写方法来访问我们的表,它可以工作,但这不是正确的方法。您能否建议是否有任何其他方法来获取 WSO2 的数据源对象,以便我们可以在应用程序中使用它。

4

1 回答 1

0

你的描述不是很清楚。如果您正在尝试获取数据源对象,您可以这样做。

public static DataSource lookupDataSource(String dataSourceName, final Hashtable<Object, Object> jndiProperties) {
    try {
        if (jndiProperties == null || jndiProperties.isEmpty()) {
            return (DataSource) InitialContext.doLookup(dataSourceName);
        }
        final InitialContext context = new InitialContext(jndiProperties);
        return (DataSource) context.doLookup(dataSourceName);
    } catch (Exception e) {
        throw new RuntimeException("Error in looking up data source: " + e.getMessage(), e);
    }
}

您可以在 master-datasource.xml 中定义数据源并为其指定一个用于查找的 JNDI 名称。

于 2016-09-28T13:39:18.730 回答