Nhà cung cấp trong JAX-RS có nghĩa là gì?


110

Bất cứ ai có thể giải thích cho tôi Nhà cung cấp JAX-RS là gì và chú thích '@Provider' làm gì không? Tôi đã đọc tài liệu nhưng tôi không hiểu được.
Nếu có các lớp tài nguyên phục vụ các yêu cầu đến, Nhà cung cấp sẽ làm gì? Chúng khác với các lớp tài nguyên singleton như thế nào khi tôi tạo một lớp tài nguyên liên tục (lớp không theo yêu cầu)? Hay những lớp đó cũng là nhà cung cấp?


Để giải quyết vấn đề này: Tại sao tài liệu JAX-RS không giải thích điều này trong đoạn đầu tiên của chương "Nhà cung cấp" — trang logic mà tôi đã lật đến khi tìm hiểu. Tài liệu JAX-RS PDF
Jonathan Komar

Câu trả lời:


138

Nhà cung cấp chỉ là một cách đơn giản để mở rộng và tùy chỉnh thời gian chạy JAX-RS. Bạn có thể coi chúng như là các plugin (có khả năng) thay đổi hành vi của thời gian chạy, để đạt được một tập hợp các mục tiêu (do chương trình xác định).

Trình cung cấp không giống như các lớp tài nguyên, chúng tồn tại, về mặt khái niệm, ở mức giữa các lớp tài nguyên và việc triển khai JAX-RS. Nếu nó hữu ích, bạn có thể nghĩ về chúng giống như trình điều khiển thiết bị (tồn tại giữa không gian người dùng và nhân). Đây là một khái quát rộng.

Có ba lớp nhà cung cấp được xác định bởi đặc tả JAX-RS hiện tại. Điểm chung giữa chúng là tất cả các nhà cung cấp phải được xác định bằng chú thích @Provider và tuân theo các quy tắc nhất định để khai báo hàm tạo. Ngoài ra, các loại trình cung cấp khác nhau có thể có thêm chú thích và sẽ triển khai các giao diện khác nhau.


Nhà cung cấp thực thể

Các nhà cung cấp này kiểm soát việc ánh xạ các biểu diễn dữ liệu (như XML, JSON, CSV) sang các đối tượng Java tương đương của họ.

Nhà cung cấp ngữ cảnh

Các nhà cung cấp này kiểm soát ngữ cảnh mà tài nguyên có thể truy cập thông qua chú thích @Context.

Nhà cung cấp ngoại lệ

Các nhà cung cấp này kiểm soát việc ánh xạ các ngoại lệ Java tới một cá thể Phản hồi JAX-RS.


Thời gian chạy của bạn sẽ đi kèm với một số nhà cung cấp được xác định trước sẽ chịu trách nhiệm triển khai cấp cơ sở của chức năng (ví dụ: ánh xạ tới và từ XML, dịch các ngoại lệ phổ biến nhất, v.v.). Bạn cũng có thể tạo các nhà cung cấp của riêng mình nếu cần.

Đặc tả JAX-RS là một tài liệu tham khảo tốt để đọc về các loại trình cung cấp khác nhau này và những gì chúng làm (xem Chương 4).


Cảm ơn. Tôi nghĩ rằng tôi đã có ý tưởng trong những điều =)
Artem Moskalev

@Perception được giải thích rõ ràng. Điều này thực sự giúp ích trong sự hiểu biết của tôi.
L-Samuels

Giải thích tốt. Tuy nhiên, một câu hỏi đặt ra - triển khai @provider khác với triển khai giao diện javax.ws.rs.core.Feature được đưa vào thông qua init param (jersey.config.server.provider.classnames) trong web.xml như thế nào? Đơn hàng được kiểm soát như thế nào?
Andy Dufresne

Lưu ý phiên bản mới nhất của đặc tả JAX-RS (Phiên bản 2.1 Bản phát hành cuối cùng vào ngày 13 tháng 7 năm 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar

13

Các @Provider chú thích được sử dụng cho bất cứ điều gì là quan tâm đến các JAX-RS thời gian chạy , chẳng hạn như MessageBodyReaderMessageBodyWriter . Đối với các yêu cầu HTTP, MessageBodyReader được sử dụng để ánh xạ một phần thân thực thể yêu cầu HTTP với các tham số phương thức. Về phía phản hồi, một giá trị trả về được ánh xạ tới thân thực thể phản hồi HTTP bằng cách sử dụng MessageBodyWriter. Nếu ứng dụng cần cung cấp siêu dữ liệu bổ sung, chẳng hạn như tiêu đề HTTP hoặc mã trạng thái khác, một phương thức có thể trả về Phản hồi bao bọc thực thể và có thể được tạo bằng Phản hồi. ResponseBuilder .

Chú thích @Provider cung cấp cho bạn khả năng kiểm tra các thư đến và đi ở cấp XML thô và theo cách này Nhà cung cấp là đối tác của Dispatch trên máy khách.


6

Để thực hiện các hoạt động nhất định như Lọc-Yêu cầu / Phản hồi, Xử lý Ngoại lệ, JAX-RS có logic triển khai mặc định của riêng nó. Tuy nhiên, nó cho phép người dùng cung cấp việc triển khai của chính họ.

Để cung cấp triển khai của riêng mình, chúng tôi cần triển khai các lớp thích hợp bằng cách chỉ định chúng với chú thích @Provider.

JAX-RS sẽ thực hiện một vòng quét để tìm sự tồn tại của bất kỳ triển khai nào do người dùng xác định như vậy bằng cách tìm kiếm chú thích @Provider.

Ví dụ:

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.