Provider ใน JAX-RS หมายถึงอะไร


110

ใครช่วยอธิบายให้ฉันฟังได้ไหมว่าผู้ให้บริการ JAX-RS คืออะไรและคำอธิบายประกอบ "@Provider" ทำอะไร ฉันอ่านเอกสารประกอบ แต่ไม่สามารถอ่านได้
หากมีคลาสทรัพยากรที่ให้บริการคำขอที่เข้ามาผู้ให้บริการจะทำอย่างไร พวกเขาแตกต่างจากคลาสทรัพยากรเดี่ยวอย่างไรเมื่อฉันสร้างคลาสทรัพยากรถาวร (คลาสที่ไม่ใช่ตามคำขอ) หรือชั้นเรียนเหล่านั้นเป็นผู้ให้บริการด้วย?


เพื่อให้สอดคล้องกับสิ่งนี้: เหตุใดเอกสาร JAX-RS จึงไม่อธิบายสิ่งนี้ในย่อหน้าแรกของบท "ผู้ให้บริการ" ซึ่งเป็นหน้าที่มีเหตุผลที่ฉันหันไปหาเมื่อต้องการความเข้าใจ JAX-RS Documentation PDF
Jonathan Komar

คำตอบ:


138

ผู้ให้บริการเป็นวิธีง่ายๆในการขยายและปรับแต่งรันไทม์ JAX-RS คุณสามารถคิดว่ามันเป็นปลั๊กอินที่ (อาจ) เปลี่ยนพฤติกรรมของรันไทม์เพื่อให้บรรลุเป้าหมาย (กำหนดโปรแกรม)

ผู้ให้บริการไม่เหมือนกับคลาสทรัพยากรมีอยู่ในแนวความคิดในระดับระหว่างคลาสทรัพยากรและการใช้งาน JAX-RS หากช่วยได้คุณสามารถนึกถึงสิ่งเหล่านี้ในแง่เดียวกับไดรเวอร์อุปกรณ์ (มีอยู่ระหว่างพื้นที่ผู้ใช้และเคอร์เนล) นี่เป็นลักษณะทั่วไปกว้าง ๆ

มีผู้ให้บริการสามคลาสที่กำหนดโดยข้อกำหนด JAX-RS ปัจจุบัน ความเหมือนกันระหว่างพวกเขาคือผู้ให้บริการทั้งหมดจะต้องระบุโดยคำอธิบายประกอบ @Provider และปฏิบัติตามกฎบางประการสำหรับการประกาศตัวสร้าง นอกจากนั้นผู้ให้บริการประเภทต่างๆอาจมีคำอธิบายประกอบเพิ่มเติมและจะใช้อินเทอร์เฟซที่แตกต่างกัน


ผู้ให้บริการเอนทิตี

ผู้ให้บริการเหล่านี้ควบคุมการแมปการแสดงข้อมูล (เช่น XML, JSON, CSV) กับออบเจ็กต์ Java ที่เทียบเท่า

ผู้ให้บริการบริบท

ผู้ให้บริการเหล่านี้ควบคุมบริบทที่ทรัพยากรสามารถเข้าถึงผ่านคำอธิบายประกอบ @Context

ผู้ให้บริการยกเว้น

ผู้ให้บริการเหล่านี้ควบคุมการแม็ปข้อยกเว้น Java กับอินสแตนซ์การตอบกลับ JAX-RS


รันไทม์ของคุณจะมาพร้อมกับผู้ให้บริการที่กำหนดไว้ล่วงหน้าจำนวนหนึ่งซึ่งจะรับผิดชอบในการใช้ฟังก์ชันระดับพื้นฐาน (เช่นการแมปไปยังและจาก XML การแปลข้อยกเว้นที่พบบ่อยที่สุด ฯลฯ เป็นต้น) คุณยังสามารถสร้างผู้ให้บริการของคุณเองได้ตามต้องการ

ข้อกำหนด JAX-RSคือการอ้างอิงที่ดีสำหรับการอ่านบนประเภทผู้ให้บริการเหล่านี้แตกต่างกันและสิ่งที่พวกเขาทำ (ดูบทที่ 4)


ขอบคุณ. ฉันคิดว่าฉันมีความคิดในเรื่องนี้ =)
Artem Moskalev

อธิบายได้ดี @Perception สิ่งนี้ช่วยได้มากในความเข้าใจของฉัน
L-Samuels

อธิบายได้ดี คำถามหนึ่งข้อ - การใช้งาน @provider แตกต่างจากการใช้งาน javax.ws.rs.core อย่างไรอินเตอร์เฟซคุณลักษณะที่ฉีดผ่านพารามิเตอร์ init (jersey.config.server.provider.classnames) ใน web.xml คำสั่งถูกควบคุมอย่างไร?
Andy Dufresne

หมายเหตุข้อมูลจำเพาะ JAX-RS เวอร์ชันล่าสุด (เวอร์ชัน 2.1 Final Release 13 กรกฎาคม 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar

13

@Providerคำอธิบายประกอบที่ใช้สำหรับสิ่งที่เป็นที่สนใจของJAX-RS รันไทม์เช่นMessageBodyReaderและMessageBodyWriter สำหรับคำร้องขอ HTTP MessageBodyReader ถูกใช้เพื่อแม็พเนื้อหาเอนทิตีคำร้องขอ HTTP กับพารามิเตอร์เมธอด ในด้านการตอบกลับค่าที่ส่งคืนจะถูกแมปกับเนื้อหาเอนทิตีการตอบกลับ HTTP โดยใช้ MessageBodyWriter หากแอปพลิเคชันจำเป็นต้องจัดหาข้อมูลเมตาเพิ่มเติมเช่นส่วนหัว HTTP หรือรหัสสถานะอื่นเมธอดสามารถส่งคืนการตอบกลับที่รวมเอนทิตีและสามารถสร้างได้โดยใช้การตอบกลับ ResponseBuilder

คำอธิบายประกอบ@Providerช่วยให้คุณสามารถตรวจสอบข้อความขาเข้าและขาออกในระดับ XML ดิบและด้วยวิธีนี้ผู้ให้บริการจึงเป็นคู่กันในการจัดส่งบนไคลเอนต์


6

ในการทำกิจกรรมบางอย่างเช่นการกรองคำขอ / การตอบกลับการจัดการข้อยกเว้น JAX-RS มีตรรกะการใช้งานเริ่มต้นของตัวเอง อย่างไรก็ตามจะช่วยให้ผู้ใช้สามารถให้บริการการใช้งานของตนเองได้เช่นกัน

ในการจัดเตรียมการใช้งานของเราเองเราจำเป็นต้องใช้คลาสที่เหมาะสมโดยระบุด้วยคำอธิบายประกอบ @Provider

JAX-RS จะทำการสแกนรอบ ๆ เพื่อค้นหาความเป็นอยู่ของการใช้งานที่ผู้ใช้กำหนดดังกล่าวโดยการค้นหาคำอธิบายประกอบ @Provider

ตัวอย่างเช่น:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.