2012-03-27 41 views
8

Tôi phát hiện ra một tính năng mới trong java yên tĩnh khi sử dụng EJB 3.1 trong khi đọc một bài báo tại Adam Bien's blog.Làm cách nào để hiển thị EJB 3.1 dưới dạng dịch vụ web REST?

Điều này là hạt Stateless và Singleton có thể được hiển thị dưới dạng tài nguyên gốc. Nhưng bằng cách nào? tôi đã cố gắng để làm điều đó theo cách này:

@Stateless 
@LocalBean 
@Path("Hybrid") 
public class RESTEJBSample { 

    @GET 
    @Path("/demo") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String something() { 
     return "I am a Hybrid!!!"; 
    } 

} 

Khi tôi gọi URL http://localhost:8080/HybridSample/resources/Hybrid/demo tôi nhận được một lỗi 404.

Appart của điều này và chỉ để đảm bảo rằng JAXRS đang làm việc trong dự án của tôi, tôi đã tạo một tài nguyên pojo đơn giản chỉ để kiểm tra nếu nó hoạt động tốt.

@Path("/genericresource") 
public class GenericResource { 
    @GET 
    @Path("/samplemethod") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String saySomething() { 
     return "Something!"; 
    } 
} 

Ở đây khi tôi gọi URL http://localhost:8080/HybridSample/resources/genericresource/samplemethod Nó hoạt động tốt!

Vì vậy, câu hỏi của tôi là:

  • những gì còn thiếu trong EJB của tôi vì vậy nó có thể làm việc như một nguồn lực dịch vụ web như GenericResource lớp đang làm gì?

  • Có một số cấu hình bổ sung cần thiết không?

  • Những hạn chế khi sử dụng EJB làm dịch vụ web là gì?

Trả lời

11

Theo NetBeans tutorial about Jersey RESTFul web services này, bạn có thể quyết định có nên

tạo một lớp con của javax.ws.rs.core.Application, mọi nguồn lực Nghỉ ngơi sẽ được đăng ký bởi lớp này tự động (Java EE 6)

hoặc

tạo Jers mặc định ey REST bộ điều hợp servlet trong web.xml.

Tôi đã luôn luôn sử dụng các lựa chọn thứ hai, trong đó bao gồm trong việc thêm này để web.xml của bạn:

<servlet> 
    <servlet-name>ServletAdaptor</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ServletAdaptor</servlet-name> 
    <url-pattern>/resources/*</url-pattern> 
</servlet-mapping> 

Vạch trần dịch vụ Web REST của bạn như là một EJB là, kinh nghiệm của tôi, cực kỳ hữu ích. Bạn có thể tiêm nó bất cứ nơi nào bạn thích, bạn có thể tiêm nó vào EntityManager của bạn, và thậm chí bạn có thể sử dụng nó như một DAO trong một số tình huống đơn giản.

Liên quan đến câu hỏi/nhận xét của bạn về các tính năng và giới hạn: hạt doanh nghiệp chạy trong vùng chứa EJB, cho dù chúng được triển khai trong tệp chiến tranh hay không. Bạn có thể tiêm vào chúng một JMS ConnectionFactory như một tài nguyên như được giải thích trong this section của Hướng dẫn Java EE 6. Nhờ có một ConnectionFactory, bạn có thể gửi tin nhắn JMS. Nếu bạn muốn nhận tin nhắn JMS không đồng bộ, bạn cần phải xác định Bean theo thông báo như được giải thích trong this section của hướng dẫn được đề cập ở trên. Tôi chưa bao giờ cố gắng mở rộng cùng một EJB được sử dụng cho dịch vụ web Jersey để triển khai giao diện MessageListener, nhưng tôi nghĩ rằng cũng nên có khả năng (nếu không, bạn có thể tiêm MDB vào bean Gốc của Jersey) .

Cuối cùng, bạn có thể sử dụng các giao dịch do Vùng chứa được quản lý như được giải thích here. Hơn nữa, từ this NetBeans tutorial:

Để có bạn có thể thấy rằng các ứng dụng sẽ sử dụng API giao dịch Java (JTA) (giao dịch type = "JTA"). Điều này quy định rằng trách nhiệm quản lý vòng đời của các thực thể trong bối cảnh kiên trì được gán cho vùng chứa.

<persistence-unit name="em" transaction-type="JTA"> 
+0

Tốt i didnt biết một :) Tùy chọn web.xml đầu tiên cũng là favoutity tôi, hiện lookl web.xml của tôi như thế rồi. Ngoài ra tôi đã sử dụng IDE Netbeans 'Mới-> Webservice' và làm theo hướng dẫn tôi đánh dấu vào một tùy chọn cho biết tạo dịch vụ web là bean không trạng thái. Điều đó chèn thêm EJB vào tệp .war và bây giờ nó hoạt động tốt. Ví dụ của tôi hoạt động tốt bây giờ, nhưng tôi cũng sẽ quan tâm đến việc biết những gì đang xảy ra đằng sau hiện trường ?, những gì các tập tin đang được chỉnh sửa bởi Net Beans? Và những hạn chế của loại đậu này là gì? Vâng tôi nghĩ rằng đây cũng là một tính năng rất thú vị. – sfrj

+0

NetBeans không thêm bất cứ điều gì: những điều duy nhất bạn phải làm là tạo ra lớp không trạng thái (RESTEJBSample trong ví dụ của bạn) và bộ điều hợp servlet trong web.xml. Servlet đang làm tất cả các phép thuật đằng sau hậu trường. Về những hạn chế, tôi nghĩ rằng bạn nên cố gắng làm rõ một chút câu hỏi của bạn. – perissf

+0

Khi tôi đề cập đến những hạn chế tôi muốn nói. Những hạt cà phê này có thể hoạt động theo cùng một cách như khi được triển khai trong các Mô-đun EJB không? Những gì tôi có nghĩa là có bất kỳ cần cho một số loại quản lý giao dịch thủ công? Họ có thể tương tác với JMS? ... Bây giờ họ không có trong EJB container, họ đang ở trong một tập tin .war. – sfrj

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