java: comp / env / do คืออะไร?


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/คำนำหน้าในมูลค่าที่ฉันจะได้รับข้อผิดพลาดที่กล่าวว่า"ชื่อ JDBC ไม่ผูกพันในบริบทนี้"


3
ตอนแรกคุณใช้อันไหน คำถามของคุณบ่งบอกว่าคุณใช้ตัวอย่างที่สองอย่างไม่ถูกต้อง ( jdbc/locจึงjava:comp/env/jdbc/locถูกต้อง) ในขณะที่คำตอบของ cherouvim บ่งบอกว่าคุณใช้ตัวอย่างแรกไม่ถูกต้อง ( java:comp/env/jdbc/locจึงjdbc/locถูกต้อง) ไม่ว่าคำตอบที่แท้จริงคือขึ้นอยู่กับบริบทปัจจุบัน
BalusC

1
อันที่ใช้ไม่ได้คือ java: comp / env / jdbc / loc ขาดหายไปตามนัย ไฟล์บริบทที่ชี้ให้รวมทรัพยากร "loc" บริบท "ปัจจุบัน" มีความเป็นไปได้อย่างไร
Danny

คำตอบ:


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" มีการเชื่อมโยง 2 แบบ ได้แก่ "env" และ "UserTransaction" ชื่อ "env" ถูกผูกไว้กับทรีย่อยที่สงวนไว้สำหรับการโยงที่เกี่ยวข้องกับสภาพแวดล้อมของคอมโพเนนต์ตามที่กำหนดโดยตัวอธิบายการปรับใช้ "env" ย่อมาจากสิ่งแวดล้อม J2EE แนะนำ (แต่ไม่ต้องการ) โครงสร้างต่อไปนี้สำหรับเนมสเปซ "env"

ดังนั้นการเชื่อมโยงที่คุณทำตั้งแต่ฤดูใบไม้ผลิหรือตัวอย่างเช่นจากตัวบอกบริบท 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 ออกจากค่าได้หรือไม่ ในกรณีของฉันฉันต้องเพิ่มเพื่อให้ข้อผิดพลาด "Name jdbc is not bound in this Context" หายไป
Danny

4
คุณผูกโดยใช้ "foo" และค้นหาโดยใช้ "java: comp / env / foo" เข้าไปดูได้ที่blog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim

3
ที่ลิงค์ข้างต้นจากแบบสแตนด์อโลน JNDI กวดวิชาที่มีอยู่เดิมเมื่อ: docs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html
Danilo Piazzalunga

จะเกิดอะไรขึ้นถ้ามีการค้นหาของคุณมากขึ้น เช่น "java: com / env / foo / bar" ค่า jndiName ของคุณเป็น "foo / bar" หรือ "foo.bar" หรือไม่
Pieter De Bie

ค่า jndiName ที่ถูกต้องจะเป็น "foo / bar" @PieterDeBrie
tftdias

37

นอกจากนี้ยังมีคุณสมบัติresourceRefของการJndiObjectFactoryBeanที่มีการตั้งค่าเมื่อ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: / liferayแทนjava: comp / env / liferay


คุณช่วยยกตัวอย่างที่สมบูรณ์รวมถึงนิยามทรัพยากรได้ไหม ฉันไม่สามารถตั้งค่านี้ได้สำเร็จด้วย Tomcat 8.5 - ตัวอย่างที่ครอบคลุมมากขึ้นจะช่วยให้ฉันเห็นข้อผิดพลาดของฉันบางที
RobertG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.