gpt4 book ai didi

java - 在 Jetty 9 中使用没有密码的数据源时出错

转载 作者:行者123 更新时间:2023-12-01 14:21:29 25 4
gpt4 key购买 nike

我能够使用 HSQLDB 和 Jetty 在我的系统上运行以下示例项目:

然后我想将项目转换为使用 JNDI 来引用数据源。首先,我将以下资源引用添加到我的 web.xml 中:

<resource-ref>
<res-ref-name>jdbc/mydatasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

然后,我将以下数据源添加到我的 $JETTY_HOME/etc/jetty.xml 文件中:

<New id="mydatasource" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/mydatasource</Arg>
<Arg>
<New class="org.hsqldb.jdbc.JDBCDataSource">
<Set name="Url">file:mytestdb</Set>
<Set name="User">SA</Set>
<Set name="Password"></Set>
</New>
</Arg>
</New>

...然后我使用以下代码引用了数据源:

try {
//con=DriverManager.getConnection("jdbc:hsqldb:mydatabase","SA","");

InitialContext context = new InitialContext();
DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/mydatasource");
con = dataSource.getConnection();

con.createStatement().executeUpdate("create table contacts (name varchar(45),email varchar(45),phone varchar(45))");
} catch (NamingException ne) {
ne.printStackTrace(System.out);
} catch (SQLException e) {
e.printStackTrace(System.out);
}

然后,我将应用程序部署为分解目录,并尝试启动 Jetty 进程。当我这样做时,它崩溃了,并且收到以下错误消息:

# tom at toshi in ~/Downloads/jetty-distribution-9.0.4.v20130625 [19:41:34]
$ java -jar ./start.jar <<<
2013-07-07 19:41:39.335:WARN:oejx.XmlConfiguration:main: Config error at <Set name="Password"/> java.lang.refle
ct.InvocationTargetException in file:/home/tom/Downloads/jetty-distribution-9.0.4.v20130625/etc/jetty.xml
2013-07-07 19:41:39.349:WARN:oejx.XmlConfiguration:main: Config error at <New id="mydatasource" class="org.ecli
pse.jetty.plus.jndi.Resource"><Arg/><Arg>jdbc/mydatasource</Arg><Arg>| <New class="org.hsqldb.jdbc.J
DBCDataSource"><Set name="Url">file:mytestdb</Set><Set name="User">SA</Set><Set name="Password"/></New>|
</Arg></New> java.lang.reflect.InvocationTargetException in file:/home/tom/Downloads/jetty-distribution-9.0.4.
v20130625/etc/jetty.xml
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.eclipse.jetty.start.Main.invokeMain(Main.java:509)
at org.eclipse.jetty.start.Main.start(Main.java:651)
at org.eclipse.jetty.start.Main.main(Main.java:99)
...

好吧,它不喜欢密码字段为空。然后我尝试做这个更改我的 jetty.xml:

    <!--<Set name="Password"></Set>--> <!-- Got rid of this -->
<Set name="Password" />

我仍然遇到同样的错误。所以我然后从我的数据源中删除了“密码”属性我能够启动 Jetty!坏消息是,现在当我尝试执行此操作时出现此错误任何引用数据库的内容:

2013-07-07 19:49:09.682:WARN:jndi:qtp14895676-19: 
java.lang.Exception: org.hsqldb.jdbc.JDBCDataSource: invalid RefAddr: password
at org.hsqldb.jdbc.JDBCDataSourceFactory.getObjectInstance(Unknown Source)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:476)
at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:518)
at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:533)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:468)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551)
at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at Register.init(Register.java:31)
...

该警告之后是一个空指针异常。

所以现在看来​​ HSQLDB 驱动程序正在依赖密码的存在数据源中的字段。

这就是我的第 22 条军规:我无法使用空密码字段启动 Jetty数据源,但如果我省略它,驱动程序将无法工作。

有谁知道在 Jetty 中使用空密码创建数据源的方法吗?

最后,我知道我可以 a) 不使用 JNDI 或 b) 为 SA 用户提供密码。然而,我的特定项目要求我使用 JNDI 并且不给 SA 用户密码。

最佳答案

就我而言,将密码设置为“”不起作用。

创建 java.lang.String 解决了我的问题。

<Set name="password">
<New class="java.lang.String" />
</Set>

关于java - 在 Jetty 9 中使用没有密码的数据源时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com