java : comp / env /는 무엇을합니까?


116

JNDI 팩토리 빈을 연결할 때 오류를 파악하려고 하루 중 너무 많은 시간을 보냈습니다. 문제는 이것 대신에 ...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>

나는 실제로 이것을 썼다 ...

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
</bean>

나는 java:comp/env/아마도 일부 환경 변수를 참조하고 궁극적으로 내 컨텍스트 파일을 볼 수 있도록 만듭니다. 유일한 차이점은 java:comp/env/입니다. 전문가의 입에서, 그것은 무엇을합니까?

java:comp/env/값에 접두사가 없으면 "Name jdbc is not bound in this Context" 라는 오류가 발생합니다 .


3
처음에 어떤 것을 사용 했습니까? 귀하의 질문은 두 번째 예를 잘못 사용했음을 의미하며 ( jdbc/loc따라서 java:comp/env/jdbc/loc정확합니다) cherouvim의 대답은 첫 번째 예를 잘못 사용했음을 의미 java:comp/env/jdbc/loc하므로 jdbc/loc정확합니다. 그럼에도 불구하고 실제 대답은 현재 상황 에 따라 다릅니다 .
BalusC 2010

1
작동하지 않는 것은 실제로 묵시적으로 java : comp / env / jdbc / loc이 누락되었습니다. "loc"리소스를 포함하도록 지정된 컨텍스트 파일입니다. "현재"컨텍스트의 가능성은 무엇입니까?
Danny 2011

답변:


100

인용 https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

네임 스페이스의 루트 컨텍스트에는 구성 요소 관련 바인딩을 위해 예약 된 하위 트리에 바인딩 된 "comp"라는 이름의 바인딩이 있습니다. 이름 "comp"는 구성 요소의 약자입니다. 루트 컨텍스트에는 다른 바인딩이 없습니다. 그러나 루트 컨텍스트는 정책의 향후 확장, 특히 구성 요소 자체가 아니라 사용자 또는 부서와 같은 다른 유형의 엔터티에 연결된 리소스 이름 지정을 위해 예약되어 있습니다. 예를 들어, 향후 정책에서는 "java : user / alice"및 "java : org / engineering"과 같은 이름을 사용하여 사용자 및 조직 / 부서의 이름을 지정할 수 있습니다.

"comp"컨텍스트에는 "env"와 "UserTransaction"의 두 가지 바인딩이 있습니다. "env"라는 이름은 배포 설명자에 정의 된대로 구성 요소의 환경 관련 바인딩을 위해 예약 된 하위 트리에 바인딩됩니다. "env"는 환경의 약자입니다. J2EE는 "env"네임 스페이스에 대해 다음 구조를 권장합니다 (필수는 아님).

따라서 spring 또는 예를 들어 tomcat 컨텍스트 설명자에서 수행 한 바인딩은 기본적으로 java : comp / env / 아래에 있습니다.

예를 들어 구성이 다음과 같은 경우 :

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="foo"/>
</bean>

그런 다음 다음을 사용하여 직접 액세스 할 수 있습니다.

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");

또는 검색하는 모든 리소스에 대해 "java : comp / env"를 지정할 필요가 없도록 중간 단계를 만들 수 있습니다.

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");

나는 이것을 올바르게 이해했다고 생각했지만, 더 많은 코멘트를 통해 내가 그렇게 거꾸로했다는 것을 깨달았다. tomcat 컨텍스트 설명자가 기본적으로 java : comp / env 아래에 갔다면 값에서 java : comp / env를 생략 할 수 있다는 의미가 아닙니까? 제 경우에는 "이름 jdbc가이 컨텍스트에 바인딩되지 않았습니다"라는 오류를 없애기 위해 추가해야했습니다.
Danny

4
"foo"를 사용하여 바인딩하고 "java : comp / env / foo"를 사용하여 조회합니다. 한 번 봐 가지고 blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim

3
위 링크는 원래 docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html에서 사용할 수있는 독립형 JNDI 자습서에서 가져온 것 입니다 .
Danilo Piazzalunga

조회에 / -es가 더 있으면 어떻게됩니까? 예 : "java : com / env / foo / bar", jndiName 값이 "foo / bar"또는 "foo.bar"입니까?
Pieter De Bie 2015 년

올바른 jndiName 값은 "foo / bar"@PieterDeBrie입니다.
tftdias

37

속성도 있습니다 resourceRefJndiObjectFactoryBean로 설정하면 즉, true자동으로 문자열을 앞에 추가하는 데 사용, java:comp/env/존재하지 않는 경우에.

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
  <property name="resourceRef" value="true"/>
</bean>

3

몇 번의 시도와 Tomcat의 소스 코드를 자세히 살펴본 후 간단한 속성 useNaming = "false" 가 트릭을 수행 했음을 알았습니다 !! 이제 Tomcat 은 java : comp / env / liferay 대신 java : / liferay 이름을 확인합니다 .


자원 정의를 포함하여 완전한 예를 제공 할 수 있습니까? 나는 Tomcat 8.5에서 이것을 성공적으로 설정하지 못했습니다. 좀 더 포괄적 인 예제가 내 실수를 보는 데 도움이 될 것입니다.
RobertG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.