2013-07-08 2 views
0

나는 HSQLDB 및 부두 사용하여 내 시스템에서 다음 예제 프로젝트 작업 할 수 있었다 : 다음에 원하는오류 부두에서 암호가없는 데이터 소스를 사용하는 경우 9

을 JNDI를 사용하여 데이터 소스를 참조하도록 프로젝트를 변환하십시오.

<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 파일에 다음 데이터 소스를 추가 : 첫째, 내 web.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" /> 

나는 여전히 같은 오류가 발생했습니다. 그래서 나는 내 데이터 소스에서 "Password"속성을 삭제했다 그리고 나는 부두를 시작할 수 있었다! 다음 널 포인터 예외로 하였다 있다는 경고

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 드라이버가 데이터 소스의 암호 필드의 존재를 믿고있는 것처럼 보입니다.

내 catch-22입니다. 내 데이터 소스에서 빈 암호 필드를 사용하여 부두를 시작할 수 없지만이를 생략하면 드라이버가 작동하지 않습니다.

누구도 Jetty에서 빈 암호로 데이터 소스를 만드는 방법을 알고 있습니까?

마지막으로 나는 a) JNDI를 사용하지 않거나 b) SA 사용자에게 암호를 줄 수 있음을 알고 있습니다. 그러나 내 특정 프로젝트에서는 JNDI를 사용하고 SA 사용자에게 암호를 제공하지 않아야합니다.

+1

HSQLDB JDBCDataSource의 암호를 설정해야합니다. 이 경우 ""(길이가 0 인 문자열)입니다. JNDI는 비어있을 때 암호를 설정하지 않는 것 같습니다. – fredt

+0

고마워 톤 프레드, 이건 내 문제를 해결!나는이 논평이 문제를 해결했다고 말할 수 있었으면 좋겠다. –

+0

당신을 진심으로 환영합니다. 해결책으로 직접 질문에 답하고 동의하십시오. – fredt

답변

0

감사합니다. fredt!

난 그저 내 jetty.xml의 파일에 빈 암호를 다음과 같은 방법을 지정했다 :

... 
<Set name="Password">""</Set> 
... 

모든 것이 완벽하게 작동 후.