我已经编写了一个 RESTful Web API 供我的客户端(Android 应用程序)使用。
我需要实现另一个应用程序,一个本地桌面应用程序,它访问已为服务器端实现的Databases
类。
我不知道该怎么做。
具体来说,此类用于服务器端:
public Database(String TableName, String KeyName) throws SQLException, NamingException {
mTableName = TableName;
mKeyName = KeyName;
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/nasdaq_companies");
}
现在抛出了一个异常(NoInitialContextException),这是完全有道理的,因为我缺少 context.xml 或者特别是在其中缺少此资源
<Resource name="jdbc/nasdaq_companies" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/nasdaq_companies"
username="*****" password="*****" maxActive="20" maxIdle="10" maxWait="-1"/>
假设服务器== localhost,如何将上下文资源添加到本地java应用程序? (否则,我该如何解决这个问题?)
最佳答案
如果您正在谈论运行类似控制台应用程序之类的东西,我通过调用 Main 中的方法手动设置上下文来解决它,如下所示:
public static void setupInitialContext() {
try {
NamingManager.setInitialContextFactoryBuilder(new InitialContextFactoryBuilder() {
@Override
public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) throws NamingException {
return new InitialContextFactory() {
@Override
public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
return new InitialContext() {
private Hashtable<String, DataSource> dataSources = new Hashtable<>();
@Override
public Object lookup(String name) throws NamingException {
if (dataSources.isEmpty()) { //init datasources
MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
ds.setURL("jdbc:mysql://localhost:3306/SomeDB");
ds.setUser("dbuser");
ds.setPassword("dbpass");
dataSources.put("jdbc/SomeDataSourceName", ds);
//lets add another datasource (optional)
MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
ds.setURL("jdbc:mysql://localhost:3306/OtherDB");
ds.setUser("dbuser");
ds.setPassword("dbpass");
dataSources.put("jdbc/OtherDataSourceName", ds);
//you can keep adding these as you need
}
if (dataSources.containsKey(name)) {
return dataSources.get(name);
}
return null; //or throw exception Java style :)
}
};
}
};
}
});
}
catch (NamingException ne) {
}
}
编辑:
您可以通过首先在 Main 中调用此方法来使用此方法,然后获取这些数据源应该可以工作
public static void main( String[] args ) {
setupInitialContext();
Context initContext = new InitialContext();
DataSource dataSource = (DataSource) initContext.lookup("jdbc/SomeDB");
}
PS:我想我也在 StackOverflow 上找到了这种方法,但说实话我不记得在哪里了:(
关于java - 如何在本地运行网络应用程序代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443581/