خانه / آموزش / JSON با Jackson (بخش پنجم) استفاده در JAX-RS

JSON با Jackson (بخش پنجم) استفاده در JAX-RS

در این مقاله کاربرد اصلی Jackson یعنی تولید داده‌ی متنیِ JSON و ارسال آن در پاسخ به متد‌های وب‌سرویس شرح داده می‌شود.

در مقاله‌ای با عنوان «مقدمات ساخت ساده‌ترین پروژه‌ی وب‌سرویس» روش ساخت یک پروژه‌ی ساده‌ی وب‌سرویس با JAX-RS و پیاده سازی Jersey را شرح دادیم. در بخش‌های قبلی نیز، روش تبدیل POJO‌ها به رشته‌ی با فرمت JSON بررسی شد.

روال کار در نوشته‌ی حاضر، به این شرح است:

  • در گام اول: یک کلاس جدید با نام Student در یک پروژه‌ی وب‌سرویس که می‌تواند Hello userName را به کاربر نمایش دهد، می‌سازیم. در ادامه، به جای متن Hello userName؛ متن تولید شده از ()studentObject.toString را ارسال می‌کنیم.
  • در گام دوم: یک MessageBodyWriter ساخته و وظیفه‌ی ساخت JSON را به آن محول می‌کنیم.
  • در گام سوم: MessageBodyWriter‌ای که توسط Jackson ارائه شده را به کار می‌بندیم.
  • در گام چهارم: از امکانات Jersey برای تبدیل POJO به JSON کمک می‌گیریم.

پروژه‌ای Maven ای مشابه آنچه در این مقاله شرح داده شد می‌سازیم. و نام artifactId را simple-jackson-json-jax-rs-provider قرار می‌دهیم. مطابق شکل زیر، سه پکیج در پروژه ایجاد می‌کنیم:

در پکیج دوم (dao)، کلاس Student را به شکل زیر تعریف می‌کنیم:

در پکیج اول (application) کلاس JacksonJaxRsProviderApplication تعریف می‌شود. ساختار کد به شکل زیر است:

در قسمت‌های بعدی مقاله، هنگام استفاده از روش‌های مختلف ساخت JSON، فقط بخش‌هایی از متد سازنده‌ی کلاس فوق عوض می‌شوند. تنها به آوردن بخش تغییر کرده اکتفا خواهیم‌کرد.

پکیج سوم (services) حاوی متد‌های وب‌سرویس و پیاده‌سازی‌هایی از MessageBodyWriter خواهد بود. کلاس مهمی که در این پکیج قرار دارد StudentService است. متد‌هایی که پاسخگوی درخواست‌های GET هستند در این کلاس قرار می‌گیرند. این کلاس از یک Map به عنوان پایگاه‌داده استفاده کرده و دو نمونه Student در آن ذخیره می‌کند. ذخیره‌ی اشیا در پایگاه‌داده در سازنده انجام می‌شود. چون کلاس StudentService، به عنوان Singleton، نمونه‌سازی (Instantiate) و معرفی می‌شود، می‌توان مطمئن بود که سازنده‌ی این کلاس فقط یک بار اجرا می‌شود و در طول اجرا، Map‌ای که از آن به عنوان پایگاه‌داده استفاده می‌کنیم، فقط دو نمونه از Student خواهد داشت.

گام اول: بازیابی داده به شکل رشته معمولی

هدف از این بخش آشنایی با MessageBodyWriter است.

الف – متد وب‌سرویس

ابتدا متد زیر را به کلاس StudentService اضافه می‌کنیم.

در صورتی که متد GET روی URL زیر اجرا شود، متد فوق مورد استفاده قرار خواهد گرفت:

متد فوق، id را از URL استخراج کرده و نمونه‌ی Student‌ای در دیتابیس که این id را دارد، بازیابی می‌کند. در صورتی که چنین id‌ای در دیتابیس وجود نداشته باشد Exception‌ای پرتاب می‌شود که توسط JAX-RS به صفحه‌ی مناسب تبدیل شده و به client نشان داده شود، در غیر این صورت Responseای ساخته شده و student را به عنوان بدنه‌ی آن ارسال می‌کنیم.

ب – کلاس تولید کننده متن

محتویات Produces@ مشخص می‌کند، student باید، در قالب متن معمولی ارسال شود. تبدیل object ورودی به entity، به نوع داده‌ای که در Produces@ ذکر شده، بر عهده‌ی MessageBodyWriter هاست. در نتیجه کلاس زیر را به پکیج services اضافه می‌کنیم.

این کلاس از سه متد تشکیل شده است. متد اول getSize است و طول رشته‌ی پاسخ را محاسبه می‌کند. مقدار صفر را بر‌می‌گردانیم تا JAX-RS به صورت اتوماتیک طول رشته را محاسبه نماید.

متد دوم مشخص می‌کند MessageBodyWriter چه نوع Object هایی را می‌تواند تبدیل به رشته کند. کد نوشته شده در متد به این مفهوم است که هر شیء‌ای که نمونه ای از کلاس Student باشد توسط این کلاس قابل تبدیل به Plain text است.

متد سوم (writeTo) وظیفه‌ی نوشتن شیء در outputStream جواب را دارد.

ج-تغییرات کلاس Application

در صورتی که بخواهیم StudentMessageBodyWriterAsString (کلاس فوق) برای تبدیل، مورد استفاده قرار گیرد، سازنده موجود در JacksonJaxRsProviderApplication باید به شکل زیر تغییر پیدا کند.

د – اجرا

نتیجه ی اجرای وب اپلیکیشن روی سرور و سپس مراجعه به URL زیر در شکل نشان داده شده است:

در قدم بعدی توانایی Jackson را وارد متد writeTo خواهیم کرد تا رشته در قالب JSON ارسال شود.

گام دوم: بازیابی داده JSON با MessageBodyWriter

الف – ماژول Maven

برای اجرای مثال این بخش، dependency زیر باید به فایل pom.xml اضافه شود.

ب – متد وب‌سرویس

متد زیر را به کلاس StudentService اضافه می کنیم.

ج – کلاس تولید کننده‌ی متن

کلاس MessageBodyWriterAsJSON را در پکیج services می‌سازیم: این کلاس مشابه MessageBodyWriterAsString بوده و تنها بخش متفاوت متد زیر است:

د – تغییرات کلاس Application

همان طور که تکه کد فوق نشان می‎دهد، از ObjectMapper برای تبدیل POJO به JSON استفاده کردیم. به منظور معرفی کلاس فوق، سازنده کلاس JacksonJaxRsProviderApplication باید به شکل زیر تغییر پیدا کند.

ه – اجرا

نتیجه‌ی اجرای این وب اپلیکیشن روی سرور و مراجعه به URL زیر در شکل نشان داده شده است:

گام سوم: بازیابی داده JSON با Provider‌های Jackson

الف – ماژول Maven

وقتی از پیاده‌سازیِ Jersey از JAX-RS، استفاده می‌کنیم، دو روش برای استفاده از Jackson وجود دارد. گام سوم و چهارم به این دو روش می‌پردازند. روش اول استفاده از وابستگی زیر در maven است:

در این روش از یکی از کلاس های JacksonJsonProvider یا JacksonJaxbJsonProvider استفاده می‌شود. این دو، پیاده‌سازی‌هایی از MessageBodyWriter و MessageBodyReader اند که شرح آنها در قسمت‌های قبل ارائه شد. در صورت استفاده از این روش نیازی به کد نویسی یک MessageBodyWriter جدید نیست، چرا که ماژول Jackson پیاده‌سازی را انجام داده است؛ تنها آن را نمونه‌سازی کرده و مورد استفاده قرار می‌دهیم. (هر چند می‌توان تنظیمات مختلفی روی آن اعمال کرد، که جهت رعایت اختصار و سادگی، از آنها عبور می‌کنیم)

ب – تغییرات کلاس Application

جهت استفاده از این روش باید یک JacksonJsonProvider را به شکل زیر در سازنده معرفی کنیم:

ج– اجرا

روش اجرا و نتیجه‌ی آن مانند اجرای گام دوم است.

گام چهارم: بازیابی داده JSON با Feature‌های Jersey

الف – ماژول Maven

جهت استفاده از این روش ماژول زیر، از ماژول های Jersey به لیست وابستگی‌های Maven اضافه می شود. دقت کنید که ماژول استفاده شده در گام سوم از بسته‌های Jackson است.

jersey-media-json-jackson تنها از یک کلاس تشکیل شده و نام آن JacksonFeature است. این کلاس، Interfaceای به نام javax.ws.rs.core.Feature را پیاده سازی کرده است. Feature تنها یک متد به نام configure دارد. تکه کد زیر بخشی از سورس کد کلاس JacksonFeature است و نشان می‌دهد این کلاس نیز در پشت صحنه از Provider های Jackson (انچه در گام قبل شرح داده شد) استفاده می‌کند.

به عبارت دیگر باید گفت وظیفه‌ی معرفی Providerهای Jackson به وب‌اپلیکیشن را، این کلاس بر عهده گرفته است.

ب – تغییرات کلاس Application

در این روش باید یک JacksonFeature را به شکل زیر مورد استفاده قرار دهیم:

اشاره به این نکته خالی از فایده نیست که هنگام استفاده از Jersey، معمولا به جای Application، کلاس ResourceConfig را extend می‌کنند. این کلاس، از Application ارث بری دارد، و برای معرفی resource‌ها و Feature‌ها و … به فریم‌ورک، متد‌های ساده‌تری در دسترس قرار داده است. با این وجود، جهت حفظ تشابه مثال‌ها، همچنان از کلاس ساده‌ی Application استفاده کردیم.

ج – اجرا

روش اجرا و نتیجه‌ی آن مانند اجرای گام دوم است.

 


درباره احمد حقوقی

تجربه ی کد نویسی با زبان‌هایی مثل Matlab و Fortran و دارم، شاید به خاطر همینه که به نظر Java دوست داشتنیه و بعد از فارغ التحصیلی به صورت خود-خوان (Self-Study) روی اون کار می کنم.

همچنین بررسی کنید

تصاویر چهارمین آزمون عمومی جاواکاپ

 

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *