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

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” 라는 오류가 발생합니다 .



답변

인용 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");


답변

속성도 있습니다 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>


답변

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


답변