我正在研究一个Java项目,该项目使用jetty在本地访问某些数据库的Web服务上运行。我们使用jtds访问SQLServer数据库,但现在我们需要使用DATETIME2字段,而强制我们使用Microsft SQLServer驱动程序而不是jtds。
因此,在设置所有使用它之前,在使用这些驱动程序直接创建Connection对象的某个junit测试上运行OK,当我们尝试主应用程序时,我们遇到了麻烦。 我们有一个像这样的jetty-env.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Call class="org.mortbay.log.Log" name="warn">
<Arg>executing jetty-env.xml</Arg>
</Call>
<New id="DATABASE" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/DATABASE</Arg>
<Arg>
<!-- Servidor SQLserver -->
<New class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
<Set name="User">username</Set>
<Set name="Password">password</Set>
<Set name="DatabaseName">databasename</Set>
<Set name="ServerName">servername</Set>
<Set name="PortNumber">portnumber</Set>
</New>
</Arg>
</New>
</Configure>
但是当我在Eclipse上使用Jetty启动应用程序时,我得到一个SQLException,说不能用用户名登录。设置一个断点和debuging,我看到当Java代码从上下文获取数据源时,它没有密码!!!
String dsName = props.getProperty ("hibernate.connection.datasource"); // "java:comp/env/jdbc/DATABASE"
Context ctx = new InitialContext();
SQLServerDataSource sqlds = (SQLServerDataSource) ctx.lookup (dsName);
//sqlds.setPassword ("passoword");
DataSource ds = (DataSource) sqlds;
如果我取消注释sqlds.setPassword行,它会对数据库保证正常。所以由于一个不明原因,SQLServerDataSource并没有从jetty获取密码。我尝试使用不同的
wtf的任何线索都在这里发生?
PD:我们正在使用Jetty 6和一个旧的自定义版本的jetty-run-jetty插件,它可以自动应用maven叠加层。因此,改变码头版本不是一个选择。编辑:添加了dsnames字符串
答案 0 :(得分:0)
好的,阅读Jetty文档,我看到Jetty正在生成DataSource对象:https://wiki.eclipse.org/Jetty/Feature/JNDI#Configuring_DataSources
在servlet / filter / etc中查找数据源:
导入javax.naming.InitialContext;
import javax.sql.DataSource;InitialContext ic = new InitialContext();
DataSource myDS = DataSource)ic.lookup(&#34; java:comp / env / jdbc / myds&#34;);
答案 1 :(得分:0)
如果你绝对需要使用MS驱动程序,你应该:
问题是MS SQLServerDataSource实现了Referenceable,当JNDI环境询问它的引用时,它不提供其password参数。这是在驱动程序代码中硬编码的。 因此,当从引用重构数据源时,密码不再存在。