كيف يمكنني تمديد رمز Java الناتج عن أدوات Jaxb أو CXF أو السبات؟

StackOverflow https://stackoverflow.com/questions/780567

سؤال

مع الكود المصدري الذي تم إنشاؤه Java، مثل

  • رمز ولدت مع أدوات السبات
  • رمز إنشاء مع مخطط Jaxb Binding (XJC)
  • رمز ولدت مع WDSL2JAVA (CXF)

جميع الفصول المدرجة هي أنواع "كائن قيمة"، دون منطق الأعمال. وإذا أضف أساليب إلى التعليمات البرمجية المصدر التي تم إنشاؤها، فسوف تفقد هذه الأساليب إذا كررت جيل التعليمات البرمجية المصدر.

هل تقدم أدوات جيل رمز Java هذه طرق "تمديد" التعليمات البرمجية التي تم إنشاؤها؟

علي سبيل المثال،

  • لتجاوز طريقة Tostring (للتسجيل)
  • لتنفيذ نمط الزائر (لتحليل البيانات / التحقق من الصحة)
هل كانت مفيدة؟

المحلول

ل JAXB، انظر إضافة السلوكيات.

في الأساس، تقوم بتكوين Jaxb لإرجاع مثيل مخصص للكائن الذي تتوقعه عادة. في المثال أدناه، يمكنك إنشاء كائن جديد Personex الذي يمتد إلى شخص كائن Jaxb. تعمل هذه الآلية جيدا في أنك تستمد من الفئات التي تم إنشاؤها، وعدم تغيير فئات JAXB أو مخططات على الإطلاق.

package org.acme.foo.impl;

class PersonEx extends Person {
  @Override
  public void setName(String name) {
    if(name.length()<3) throw new IllegalArgumentException();
    super.setName(name);
  }
}

@XmlRegistry
class ObjectFactoryEx extends ObjectFactory {
  @Override
  Person createPerson() {
    return new PersonEx();
  }
}

لاحظ أن التوجيه Roverride مهم في حالة تغييرات كائن Jaxb الخاص بك - فسوف يمنع التخصيص الخاص بك اليتيم.

نصائح أخرى

بالنسبة للإسبات، يمكنك ربط ملفات القالب المستخدمة في جيل التعليمات البرمجية لتغيير سلوكهم. إذا كنت ترغب في تعديل أدوات السبات، فيمكنك تحريرها، على سبيل المثال: DAO / DAOHOME.FTL.

يمكنك حتى إضافة الحقول إلى إخراج الإخراج "ToString ()" .hbm.xml الملفات

...
<property name="note" type="string">
    <meta attribute="use-in-tostring">true</meta>
    <column name="note" />
</property>
...

كلاهما لتسجيل الدخول والتحقق منه قد تفكر في استخدام AOP مع جوانب (لا أوصي بالتعبث مع التعليمات البرمجية التي تم إنشاؤها، لأنك قد ترغب في بناء ذلك من نقطة الصفر عدة مرات).

أولا، أود أن أؤكد من جديد أن تعديل التعليمات البرمجية المولدة لديه العديد من المشاكل المرتبطة به وهذا، حيثما أمكن يجب تجنبه. ومع ذلك، فإن هذا في بعض الأحيان غير عملي لتجنب أو أكثر من الجهد من مجرد التعامل مع التغييرات عند تجديد التعليمات البرمجية.

اللحاق Java لا يدعم مفهوم الطبقات الجزئية التي لدى C #. هذه هي بالضبط لحل هذا النوع من المشكلة.

يجب أن ترى ما إذا كانت أدوات توليد التعليمات البرمجية تدعم شكلا من أشكال التعليقات المجدية التي تقوم بها مناطق Delimit التي أضافتها بنفسك في الفصل (هذا غير مرجح ولن تساعد إذا قمت بتعديل الكود بدلا من إضافة إليه)

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

في المرة التالية، تقوم بإعادة تشغيل الأدوات واسمح لهم بالكتابة فوق الملفات الموجودة التي يمكنك فرقتها مقابل المصدر الذي يتم التحكم فيه بمصدرك ودمج التغييرات مرة أخرى في (التغييرات الأكثر تافهة مثل إضافة أعمدة / جداول جديدة سيكون القليل من الجهد.

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

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

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

الطريقة التي استخدمتها السبات هي إنشاء فصول أساسية ثم تمديدها. أضيف كل منطق عملي (إن وجد) لهذه الفرعية. غالبا ما ينتهي الأمر أيضا بتغيير قوالب Freemarker التي يستخدمها السبات لتخصيص الفئات التي تم إنشاؤها.

استشهاد AOP هو جيد. سأضيف الربيع، والتي تتميز بميزات AOP لطيفة للغاية.

القي نظرة على

http://code.google.com/p/jaxb-method-inserter/

إنه مكون إضافي صغير ل JAXB كتبته، بهذه السهولة الاستخدامات. آمل أن يساعد ذلك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top