هل يمكننا طهي جافا ، Kotlin RestController؟

تقريبا أي مبرمج جافا كتب RestController في حياته ، ولكن قلة من الناس يتساءلون عما إذا كان يفعل ذلك بشكل صحيح. حتى لو كنت مبرمجًا ذو خبرة ، فقد يكون لديك أسئلة سأحاول الإجابة عليها. ستغطي المقالة أطر عمل مثل إصدارات الإقلاع في الربيع 1.5 و 2.0 ، بالإضافة إلى الكواركس - المنافس الذي ظهر مؤخرًا في الإقلاع النابضي من القبعة الحمراء.

صورة


المشكلة


مبرمجة لفترة طويلة في java و spring boot 1.5. ولكن كانت هناك حاجة لكتابة مشروع جديد:

  1. لدي json لدمج 1600 سطر ، وبعض الفئات بها 100 حقل
  2. كنت أرغب في تجربة Kotlin و Quarkus.
  3. اكتب وحدة تحكم في الراحة يمكنها العمل مع فئة بيانات kotlin دون تعليقات توضيحية ودون إشراك سحر lombok. أريد أن تكون فئة البيانات صغيرة

ربما خمنت أن فئة بيانات kotlin هي فئة غير قابلة للتغيير أو غير قابلة للتغيير. فصل يحتوي المنشئ على جميع الحقول. أنا مؤمن كبير بمثل هذا المفهوم ؛ بعد إنشاء فئة ، لا يمكن تغييرها ؛ لا يوجد أي مستوطنين فيها. نظرًا لأنه لا يمكن تغيير صورة عامل النقل في العالم ، فإن فئة التاريخ التي تقع في وحدة التحكم هي شيء لا يمكن تغييره.

دعونا نلقي نظرة على الطرق الممكنة لحل المشكلة ، وبشكل أكثر دقة كيف يمكنك كتابة وحدة تحكم في المشروعات الحديثة:

الخيار القياسي. يدويا في الربيع أو الربيع التمهيد 1.5


ظهرت وحدات التحكم في الراحة منذ فترة طويلة ، والمثال التالي هو مثال نموذجي لاستخدامها في جافا ، والذي هو في جميع البرامج التعليمية.

نحن فقط إنشاء أبسط تحكم

@RestController public class FruitController { @PostMapping("/fruit") public void greeting(@RequestBody Fruit request) { System.out.println(request); } } 

وإنشاء POJO (كائن جافا قديم عادي)

 public class Fruit { public String name; public String description; public Fruit() { } public Fruit(String name, String description) { this.name = name; this.description = description; } } 

قد يكون هناك اختلافات مع الحقول الخاصة و getters / setters أو التعليقات التوضيحية lombok ، ولكن ليس هذه النقطة.
عظيم ، أنشأنا أول وحدة تحكم بقية يعمل. ل 90 ٪ من الحالات ، خيار العمل. يمكنك البقاء هنا.

المشاكل:

مفهوم ثابت هو كسر.
فئة بيانات مطول قليلاً.

يمكن أن نجعل غير قابل للتغيير؟


سيكون رد الفعل الطبيعي لهذه المشكلة هو قرار إزالة المنشئ الافتراضي ومنع تحرير حقول الفصل.
 @Getter public class Fruit { private String name; private String description; // public Fruit() { // } public Fruit(String name, String description) { this.name = name; this.description = description; } } 

ولكن الآن تنشأ مشكلة ، اتضح أن المكتبة (على الأرجح جاكسون) لا يمكنها إنشاء الفصل. على الأرجح سترى خطأً مثل لا يوجد مُنشئ افتراضي.

لذلك قام jackson أولاً بإنشاء الفصل باستخدام المنشئ بدون معلمات ، ثم يسمى getter / setter . يا له من رعب. بعد كل شيء ، هل هناك منشئ مع جميع المعلمات؟ لكن لسوء الحظ ، عندما يتم تجميع الفصل ، تبدو المعلمات مثل هذا.

صورة

أي في وقت التشغيل ، لا تعرف java شيئًا عن أسماء المعلمات في المُنشئ. المترجم يفقدهم.

الخيار الثاني هو التمهيد الربيعي أو الربيعي 1.5 + التعليقات التوضيحية كخلاص


لذلك ، أدركنا أننا نريد فئة ثابتة ، ونحن نعلم أننا نستخدم جاكسون. ثم يأتي التشريح للإنقاذ.

 @Getter public class Fruit { private String name; private String description; @JsonCreator public Fruit(@JsonProperty("name") String name, @JsonProperty("description")String description) { this.name = name; this.description = description; } } 

في الوقت الحالي ، في مشروعنا على sping boot 1.5 ، هذه التعليقات التوضيحية مليئة بكل شيء حرفيًا.
وإذا كنت تأخذ مولد jsonschema2pojo الشهير ، فسيولد المزيد من التعليقات التوضيحية. بصراحة ، أنا لا أحبهم.

حاول النسخ هناك:

 { "description": "description", "name": "name" } 

في الإخراج الذي نحصل عليه (يمكنك الحول والوجه):

 @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "description", "name" }) public class Example { @JsonProperty("description") private String description; @JsonProperty("name") private String name; @JsonProperty("description") public String getDescription() { return description; } @JsonProperty("description") public void setDescription(String description) { this.description = description; } @JsonProperty("name") public String getName() { return name; } @JsonProperty("name") public void setName(String name) { this.name = name; } } 

سلبيات: شروح تضخيم الطبقة إلى حد كبير. مطول جدا ، لهواة.

الخيار الثالث الربيع أو الربيع التمهيد 1.5 + العلم lombok


شكراً ، سأقتبس من التعليق:

"إذا كنت تستخدم لومبوك ، فإن أفضل طريقة هي الكتابة في lombok.config:

lombok.allArgsConstructor.addConstructorProperties = true

سيتم إنشاء هذا على المُنشئ @java.beans.ConstructorProperties ، الذي يعرف جاكسون كيف يفهمه. "

خيار رائع كان سينقذني بالتأكيد من شروح التعليقات.

سلبيات:

لكنني أريد استخدام Kotlin دون lombok.
لقد تعلمت هذا الخيار بعد فوات الأوان.

الإصدار الرابع من Spring التمهيد 2.0


 @Getter public class Fruit { private String name; private String description; public Fruit( String name, String description) { this.name = name; this.description = description; } } 

والمثير للدهشة ، أن الحذاء النابض 2.0 يعمل بهدوء مع هذه الفئة الثابتة. وكذلك مع شقيقه التوأم kotlin فئة البيانات

 data class Fruit( val name : String, val description : String) 

يبدو أن java في وقت التشغيل لا يعرف أسماء المعلمات في المُنشئ ، ولكن لسبب ما يعرف spring boot2 بالفعل كيفية العمل مع فئة البيانات. لذلك ، انظروا إلى الوالدين في بداية الربيع ، تمت إضافة دعم Kotlin هناك.

 <plugin> <groupId>org.jetbrains.kotlin</groupId> ... <configuration> <javaParameters>true</javaParameters> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <parameters>true</parameters> </configuration> </plugin> 

أنا فك تشفير. لكي لا تضيع أسماء المعلمات في مُنشئ الفصل أثناء وقت التشغيل ، يجب على المترجم أن يجتاز علامة معلمات javac .

عينة المشروع على الحذاء الربيع 2 .

الخيار الخامس. Quarkus + Kotlin


لدى Quarkus مثال على خدمة الراحة ، وهو تناظر لخياري الأول. أي تحكم بقية الطريقة القديمة. ومع ذلك ، إذا كنت ترغب في استخدامه مع Kotlin ، فسيتعين عليك إضافة إشارات كما فعلت Spring spring 2.

وصف المشكلة هنا . مثال على كيفية إضافة دعم فئة بيانات kotlin إلى quarkus هنا .

النتائج


يمكنك استخدام الخيار الأبسط الأول لإنشاء وحدات تحكم للراحة ، لكنني أنصح بالانتقال إلى فئات غير قابلة للتغيير. اكتب على Kotlin ولن تحتاج إلى lombok. يجب أن يكون الرمز أسهل وأسهل. أنا متأكد من أن المبدعين من فصل الربيع ذهبوا عن عمد لإضافة javac - معلمات إلى خيارات المترجم ويجب ألا تكون هناك جريمة في هذا. حظا سعيدا للجميع في الطريق إلى رمز مثالي.

شكرا لكم جميعا على اهتمامكم!

Source: https://habr.com/ru/post/ar480158/


All Articles