我尝试使用Spring从Tomcat 8迁移到Jetty 9的一些应用程序集中未嵌入,但是当它查找jndi数据源时,我会得到奇怪的异常。
这里有一些堆栈跟踪,http://pastebin.com/wZKEcChL
无论我喜欢在jetty.xml或jetty-web.xml中进行配置,它都会相同。
这是一个示例数据源配置:
<New class="org.eclipse.jetty.plus.jndi.Resource" id="IST2DB">
<Arg>jdbc/IST2DB</Arg>
<Arg>
<New class="com.mchange.v2.c3p0.ComboPooledDataSource">
<Set name="driverClass">com.mysql.jdbc.Driver</Set>
<Set name="jdbcUrl">jdbc:mysql://blahblah</Set>
<Set name="user">user</Set>
<Set name="password">pass</Set>
</New>
</Arg>
</New>
在这里我如何从spring配置中查找jndi(非常简单)
<jee:jndi-lookup id="ist2dbxa" jndi-name="jdbc/IST2DB"/>
我甚至尝试过编写一个数据源包装器(最终应该调用相同的东西,但尝试不会受到伤害),但没有用。
public class DataSource implements javax.sql.DataSource {
private javax.sql.DataSource dataSource;
public DataSource() throws NamingException {
Context initContext = new InitialContext();
dataSource = (javax.sql.DataSource) initContext.lookup("java:/comp/env/jdbc/IST2DB");
}
@Override
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return dataSource.getConnection(username, password);
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return dataSource.unwrap(iface);
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return dataSource.isWrapperFor(iface);
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return dataSource.getLogWriter();
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
dataSource.setLogWriter(out);
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
dataSource.setLoginTimeout(seconds);
}
@Override
public int getLoginTimeout() throws SQLException {
return dataSource.getLoginTimeout();
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return dataSource.getParentLogger();
}
}
我不知道它是否与码头或弹簧有关,但是从码头以编程方式查找工作正常。