2013-04-11 37 views
12

Tôi đã sau ...WebSphere: JNDI bối cảnh Lookup Không

Context aContext = = new InitialContext(settings); 
aContext.lookup("java:comp/env/DB2_DB"); 

Cũng đã cố gắng ...

aContext.lookup("DB2_DB"); 

web.xml

<resource-ref> 
    <description> 
    </description> 
    <res-ref-name>DB2_DB</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Application</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
    <mapped-name>DB2_DB</mapped-name> 
</resource-ref> 

sau đó trong ibm- của tôi web-bnd.xml ...

<resource-ref name="DB2_DB" binding-name="jdbc/DB2DB" /> 

Trong Websphere Tôi thấy tên ràng buộc về tài nguyên> JDBC> Data Sources

Nhưng khi tôi chạy ứng dụng của tôi, tôi thấy ...

Nguyên nhân: javax.naming.NameNotFoundException: Bối cảnh: Node04Cell/nodes/Node04/servers/server1, tên: DB2_DB: Thành phần đầu tiên trong tên DB2_DB không tìm thấy. [Gốc ngoại lệ là org.omg.CosNaming.NamingContextPackage.NotFound: IDL: omg.org/CosNaming/NamingContext/NotFound: 1,0]^M

Đây là một dự án cảng từ WAS6-8.5

+0

Tôi đoán rằng đó là ngoại lệ cho tra cứu "DB2_DB". Ngoại lệ cho tra cứu "java: comp/env/DB2_DB" là gì? –

+1

Bạn có đến đây không? Tôi chỉ có một vấn đề tương tự và với tôi đó là một lỗi đánh máy đơn giản. –

+0

Tôi quên những gì tôi đã làm (nếu tôi đã làm) để giải quyết việc kiểm tra – Jackie

Trả lời

13

Vâng, câu hỏi này khá cũ và tôi thấy rằng chưa có câu trả lời nào được chấp nhận.

Đây là những gì thực sự xảy ra:

  1. Mã của bạn thực hiện một tra cứu JNDI để java:comp/env/DB2_DB.
  2. WebSphere sử dụng trình mô tả triển khai độc quyền của WAS (ibm-web-bnd.xml) để "dịch" ứng dụng ràng buộc DB2_DB thành tên thật trong cây WebSphere JNDI (jdbc/DB2DB).
  3. WebSphere tra cứu jdbc/DB2DB và trả lại cho người gọi.

Bạn đang nhận được một NameNotFoundException trên tra cứu đầu tiên - tra cứu của java:comp/env/DB2_DB. Vấn đề không phải là với việc tìm kiếm jdbc/DB2DB; nó với việc tìm kiếm DB2_DB bên trong môi trường thành phần của bạn.

deployment descriptor của bạn trông OK với tôi, vì vậy tôi đoán rằng lý do cho vấn đề của bạn là thế này:

Context aContext = new InitialContext(settings); 

Bạn đang xây dựng một thể hiện InitialContext bằng cách cung cấp một Hashtable. Hashtable thường hữu ích khi bạn cần cung cấp các thông số đặc biệt cho việc xây dựng, nhưng bạn phải biết khi nào nên sử dụng và khi nào cần tránh nó. Mã chạy bên trong một thùng chứa JavaEE và cần truy cập đơn giản vào cây JNDI của thùng chứa hiếm khi, nếu bao giờ, nên cung cấp bất kỳ Hashtable nào tới hàm tạo InitialContext.

Tôi sẽ không ngạc nhiên nếu những gì bạn đang chuyển vào InitialContext chứa, ví dụ, một khóa PROVIDER_URL hướng dẫn tra cứu xảy ra trên một số cây JNDI nước ngoài xa xôi.

Vì vậy, tôi sẽ bắt đầu bằng việc tháo dỡ tham số:

Context aContext = new InitialContext(); 

Và sau đó cung cấp cho nó một shot.

Nếu vẫn không thành công, hãy sử dụng tiện ích dumpNamespace của WebSphere để có được bức tranh rõ ràng về cây JNDI của WebSphere.

0

tôi 'không chắc chắn những gì ibm-web-bnd.xml làm, tuy nhiên bạn có thể thử hai điều.

Trước tiên, bạn có thể thử thực hiện tra cứu toàn cầu. Hãy thử:

aContext.lookup("jdbc/DB2DB"); 

Tôi giả định nguồn dữ liệu có tên "jdbc/DB2DB" với cấu hình nguồn dữ liệu.

Nếu không, bạn nên kiểm tra xem datasource is mapped trong đơn đăng ký của mình chưa. Tôi đoán ibm-web-bnd.xml nên khi thiết lập đúng cách thực hiện ánh xạ đó.

+0

ibm-web-bnd.xml là ánh xạ từ tên tài nguyên cục bộ đến tham chiếu JNDI trong vùng chứa. – Jackie

Các vấn đề liên quan