2009-10-06 11 views
42

Tôi viết một khách hàng cho EJB của tôi và khi cố gắng để thực hiện nó, tôi nhận được ngoại lệ sau đây:NoInitialContextException lỗi

javax.naming.NoInitialContextException: Cần phải xác định tên lớp trong môi trường hoặc hệ thống bất động sản hoặc dưới dạng thông số applet hoặc trong một tệp tài nguyên ứng dụng .

Tôi không thể hiểu vấn đề là gì.

+0

Nếu bạn chưa quen với J2EE kiểm tra JNDI trên http://java.sun.com/docs/books/tutorial/ – JuanZe

+0

Trong đó, nó là một ngu ngốc, xem http://stackoverflow.com/questions/6293052/hibernate -javax-naming-noinitialcontextexception-component-mapping-via-annotat – alfonx

+1

https://docs.oracle.com/javase/tutorial/jndi/ops/faq.html#1 –

Trả lời

9

Là sự cố JNDI. Bạn sẽ thấy ngoại lệ đó nếu lớp InitialContext không có các thuộc tính mặc định cho nhà cung cấp dịch vụ JNDI cũng như các thuộc tính máy chủ được cấu hình rõ ràng.

Đặt thuộc tính môi trường Context.INITIAL_CONTEXT_FACTORY thành tên lớp của triển khai bối cảnh ban đầu mà bạn đang sử dụng. Lớp này phải có sẵn cho chương trình của bạn trong classpath.

Kiểm tra:

http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html

http://java.sun.com/products/jndi/tutorial/getStarted/TOC.html (vấn đề thời gian chạy)

+0

thx cho con trỏ, làm thế nào tôi có thể giải quyết nó? Tôi mới vào công cụ J2EE này. – Attilah

+0

Không phải là câu hỏi cho câu trả lời nhanh. Phụ thuộc vào công cụ máy chủ ứng dụng của bạn. Tôi khuyên bạn nên kiểm tra tài liệu cho máy chủ ứng dụng bạn đang sử dụng và cố gắng chạy ứng dụng Hello World EJB trên plataform của bạn để hiểu sâu hơn về chủ đề. – JuanZe

9

bạn cần phải đặt các cặp tên sau/giá trị vào một Hashtable và gọi contructor này:

public InitialContext(Hashtable<?,?> environment) 

sự các giá trị chính xác phụ thuộc vào máy chủ ứng dụng của bạn, ví dụ này là dành cho jboss

jndi.java.naming.provider.url=jnp://localhost:1099/ 
jndi.java.naming.factory.url=org.jboss.naming:org.jnp.interfaces 
jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
27

Gói javax.naming bao gồm API JNDI. Vì nó chỉ là một API, chứ không phải là một triển khai thực hiện, bạn cần phải nói cho nó biết việc triển khai thực hiện của JNDI nào. Việc triển khai thường đặc trưng cho máy chủ mà bạn đang cố gắng nói chuyện.

Để chỉ định triển khai, bạn chuyển đối tượng Properties khi bạn xây dựng InitialContext. Các thuộc tính này chỉ định việc triển khai thực hiện, cũng như vị trí của máy chủ. Phương thức khởi tạo mặc định InitialContext chỉ hữu ích khi có các thuộc tính hệ thống, nhưng các thuộc tính giống như khi bạn truyền chúng theo cách thủ công.

Bạn muốn đặt thuộc tính nào, điều đó tùy thuộc vào máy chủ của bạn. Bạn cần phải truy cập các cài đặt đó và cắm chúng vào.

1

Hầu hết các cài đặt này cũng được xác định trong tệp jndi.properties. Bạn có cái đó nằm quanh đâu đó không?

1

Vấn đề của tôi với vấn đề này là tôi đã tạo một phiên ngủ đông, nhưng có cài đặt JNDI cho cá thể cơ sở dữ liệu của tôi sai do vấn đề classpath. Chỉ cần FYI ...

0

đảm bảo phụ thuộc cho đặt tên cầu cảng và cầu nối cộng được bao gồm (không chỉ phạm vi được cung cấp). Điều này đã khắc phục sự cố cho tôi.

7

Bạn nên đặt jndi.properties. Tôi đã đưa ra dưới đây một số đoạn mã giải thích cách các thuộc tính được đặt cho activemq. Như bạn có thể đặt cho ứng dụng của bạn. Bên trong một thùng chứa J2EE như JBoss không cần thiết lập các thuộc tính này.

Properties props = new Properties(); 
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616"); 
InitialContext ctx = new InitialContext(props); 
// get the initial context 
// InitialContext ctx = new InitialContext(); 
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");   
// create a queue connection 
QueueConnection queueConn = connFactory.createQueueConnection(); 
queueConn.start(); 
// lookup the queue object 
Queue queue = (Queue) ctx.lookup("dynamicQueues/Payment_Check"); 

Tôi biết đây là câu trả lời muộn nhưng chỉ đưa ra để tham khảo trong tương lai.

1

tôi giải quyết cùng một vấn đề bằng cách thêm các thư viện Jar sau đây để dự án của tôi:

  • appserv-rt.jar
  • javaee.jar

từ thư mục: C:\Program Files\glassfish-4.0\glassfish\lib

Các liên kết đến các thư viện này đã bị hỏng và Netbeans không tìm thấy các lớp phù hợp để sử dụng.

2

Dễ dàng & giải pháp có thể định cấu hình là tạo một tệp jndi.properties và đặt tệp này trong classpath. jndi.properties có thể được tạo ra như

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 

# use the following property to configure the default connector 
java.naming.provider.url = vm://localhost 

# use the following property to specify the JNDI name the connection factory 
# should appear as. 
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry 

# register some queues in JNDI using the form 
# queue.[jndiName] = [physicalName] 
queue.MyQueue = example.MyQueue 


# register some topics in JNDI using the form 
# topic.[jndiName] = [physicalName] 
topic.MyTopic = example.MyTopic 

Chỉ cần chỉ định nhà máy đặt tên của bạn & url và đặt tập tin này trong classpath của bạn. JMS sẽ lấy thông tin yêu cầu của chính nó và nó dễ dàng cấu hình trong tương lai cũng có.

0

Làm điều này:

Properties props = new Properties(); 
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory"); 
Context initialContext = new InitialContext(props); 

Cũng thêm video này vào các thư viện của dự án:

C:\installs\glassfish\glassfish-4.1\glassfish\lib\gf-client.jar điều chỉnh con đường phù hợp

4

Cụ thể, tôi có vấn đề này khi cố gắng lấy lại mặc định (no-args) InitialContext trong một cá thể Tomcat7 được nhúng, trong SpringBoot.

Giải pháp cho tôi, là yêu cầu Tomcat gửi enableNaming.

tức

@Bean 
public TomcatEmbeddedServletContainerFactory tomcatFactory() { 
    return new TomcatEmbeddedServletContainerFactory() { 
     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      tomcat.enableNaming(); 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 
    }; 
} 
0

bạn cần phải sử dụng JBoss-client.jar trong dự án khách hàng của bạn và bạn cần phải sử dụng jar JNP-client trong dự án ejb bạn