我在tomcat的Resource
文件中使用context.xml
标记来存储数据库连接信息。我在我的平针织servlet中访问它:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup(DB_SOURCE_CONTEXT);
return ds.getConnection();
对于单元测试,我使用的是jersey-test和grizzly2,而不是部署到tomcat。我正在尝试将连接属性设置为在单元测试类中使用测试数据库(当前是MySQL,但我将其更改为DBUnit):
@BeforeClass
public static void initializeTest() throws NamingException
{
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setUrl(TEST_DB_URL);
dataSource.setMaxTotal(10);
dataSource.setMaxIdle(5);
dataSource.setInitialSize(5);
dataSource.setValidationQuery("SELECT 1");
envContext.bind(DB_SOURCE_CONTEXT, dataSource);
}
但我得到以下异常,所以显然不是正确的方法:
javax.naming.NoInitialContextException: Need to specify class name in environment or
system property, or as an applet parameter, or in an application resource file:
java.naming.factory.initial
如何设置这些值,以便servlet中的Context读取代码读取测试值?
答案 0 :(得分:0)
使用glassfish并为测试创建上下文时,我遇到了类似的问题。
您需要为InitialContext提供一些属性,以便它可以正确构建自己。
例如:
Hashtable<String, String> props = new Hashtable<>();
props.put("java.naming.factory.initial","com.sun.enterprise.naming.impl.SerialInitContextFactory");
props.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.put("java.naming.factory.state","com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
InitialContext ctx = new InitialContext(props);
希望这有帮助。