2012-01-08 27 views
13

Tôi bắt đầu triển khai REST và gần đây đã học được rằng chúng tôi có thể đặt chú thích JAX-RS của chúng tôi trên các giao diện dịch vụ Java của chúng tôi thay vì triển khai lớp.Chú thích JAX-RS: Tốt hơn để đặt trên Giao diện hoặc Lớp học?

Với tôi, có vẻ như điều này có thể dẫn đến một tệp lớp học sạch sẽ, nhưng cũng có thể dẫn đến các nhà phát triển phải liên tục lộn xộn giữa các tệp.

Ưu và khuyết điểm của mỗi phương pháp tiếp cận là gì?

+0

câu hỏi tương tự tại đây: http://stackoverflow.com/questions/11427283/benifits-of-using-java-interfaces-in-jax-rs-web-services – Kirby

Trả lời

9

Bạn nên đặt nó trong giao diện. Thay vào đó, thực hành của tôi yêu cầu tôi đặt nó vào một giao diện, bởi vì phía máy khách và máy chủ của tôi đang chia sẻ cùng một định nghĩa jax-rs.

Tôi có khuynh hướng sử dụng jax-rs cho REST-RPC.

Lý do cho REST là cho phép API URL dịch vụ web có thể sử dụng được và "có thể phục vụ" bởi bất kỳ khung lập trình nào.

Việc sử dụng jax-rs hạn chế chúng tôi sử dụng java ở phía máy chủ.

Việc sử dụng jax-rs cho REST-RPC hạn chế chúng tôi sử dụng java trên cả máy chủ và phía máy khách.

REST-RPC là gì?

Trong thái độ giải thích không quá phức tạp, RPC là cách gọi hàm/phương thức trên máy khách, khi được gửi qua dây được máy chủ phục vụ sao cho cùng một hàm/phương thức tồn tại ở phía máy chủ .

RestEasy cho phép bạn sử dụng định nghĩa jax-rs ở phía máy khách để gọi cùng một chức năng được phục vụ ở phía máy chủ.

RestyGWT, quá, với một số sửa đổi đối với giao diện để chỉ định phương thức gọi lại sẽ cho phép bạn (phần nào) sử dụng định nghĩa jax-rs trên cả phía máy khách và phía máy chủ. Bạn chỉ cần viết một kịch bản để di chuyển kiểu trả về thành đối số kiểu của phương thức gọi lại.

Bạn có thể đặt câu hỏi tại sao hạn chế bản thân thực hiện java ở cả hai phía? Điều đó sẽ không đánh bại một trong những mục đích trong cuộc sống của REST? Tôi nghĩ rằng jax-rs REST-RPC là một tuyến đường thuận tiện để triển khai và thử nghiệm dịch vụ jax-rs. Nếu bạn muốn thực hiện một dịch vụ jax-rs, có thể bạn sẽ làm điều đó ban đầu trong Java ở cả hai bên. Và sau đó khi dịch vụ của bạn rời khỏi mặt đất, bạn có thể bắt đầu viết các ứng dụng khách PHP hoặc python.

Viết jax-rs của bạn trong tệp giao diện sẽ cho phép bạn xuất bản giao diện cho các hoạt động bên ứng dụng khách. Điều này đặc biệt đúng đối với REST-RPC. Tuy nhiên, bạn có thể chạy enunciate trên định nghĩa jax-rs của bạn để xuất bản API dịch vụ web của bạn cho các lập trình viên không java.

Tôi có một số vấn đề liên quan đến chủ đề này ... http://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-part-0.html.

7

Tôi nghĩ rằng tôi phải tôn trọng một phần không đồng ý với Blessed Geek ở đây. Những gì được đề cập là một trường hợp sử dụng rất cụ thể đòi hỏi việc sử dụng các chú thích trên giao diện.

Theo kinh nghiệm của riêng tôi, tôi đã gặp phải các trường hợp trong đó khung do thiết kế hoặc do lỗi không phản hồi đúng cách để đặt chú thích trên giao diện. Ví dụ: Apache CXF không xử lý đúng yêu cầu @PUT với @PathParams được xác định trong đường dẫn khi bạn đặt chú thích trên giao diện. Đừng hỏi tôi tại sao.CXF không đơn độc trong việc này; Spring Security bị hạn chế tương tự trong việc đặt chú thích trên giao diện. Vì vậy, đây là một điểm đối với một trong những đề cập ở trên.

Trong trường hợp bạn được tự do chọn nơi để đặt chú thích, Tôi sẽ khuyên bạn xem xét ý nghĩa của quan điểm, thiết kế và dễ phát triển.

Là một đối số triết học, một số người nói rằng việc đặt chú thích trên giao diện là một hình thức lập trình hợp đồng khác - bạn đang nói rằng việc triển khai sẽ tuân theo các quy tắc nhất định.

Mặt khác của đồng tiền đó (tùy thuộc vào định nghĩa giao diện của bạn) là giao diện không nên quan tâm đến những bước mà người triển khai thực hiện trong việc đạt được mục tiêu được xác định trong hợp đồng phương thức. Ví dụ: tại sao đặt chú thích @Transactional trên giao diện khi bạn có thể có hai triển khai, một trong số đó không có ý tưởng về "giao dịch" có thể là gì?

Trong thực tế, các đường bị mờ. Trong trường hợp xác định điểm cuối ổn định, bạn có thể thích đặt chú thích thích hợp trên giao diện. Tôi nghĩ điều này có ý nghĩa trong hầu hết các trường hợp; bạn có thể sẽ không có nhiều triển khai trong đó cùng một chữ ký phương thức phản hồi với các động từ HTTP khác nhau. Tuy nhiên, bạn có thể đưa ra một tình huống mà các triển khai khác nhau thích tiêu thụ và sản xuất các loại phương tiện khác nhau.

Vì vậy, ý tưởng lớn ở đây là "nó phụ thuộc". Nhưng hy vọng đây là một số thực phẩm cho sự suy nghĩ cho những người có thể vấp ngã khi câu hỏi này.

2

Tôi có câu hỏi tương tự khi sử dụng JAX-RS với JAX-B. Hy vọng của tôi là sử dụng chú thích JAX-B trên các giao diện chứ không phải các lớp. Điều này không làm việc như tôi mong đợi, lý do là do unmarshaller. Để giải quyết vấn đề của tôi, tôi đã sử dụng các lớp học. Here là mô tả lý do tại sao và những gì tôi tìm thấy.

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