سؤال

أنا أستخدم المحور لنموذج عينة WebService. ما أقوم به الآن هو محاولة فهم ما هي القيود المفروضة على WSDL الآلي وإدخال التعليمات البرمجية.

الآن للحصول على بعض الرمز جانب الخادم:

هذا هو الهيكل العظمي لخدمة الويب العينة:

public class TestWebService {
  public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
    ....

ودروس البيانات الخاصة بي: طبقة مجردة عامة التجردة {اسم سلسلة؛

  /*get/set for name*/
  public abstract T getValue();
  public abstract void setValue(T value);
}

public class IntAttribute extends AbstractAttribute<Integer> {
  Integer value;
  public Integer getValue(){ return value; }
  public void setValue(Integer value){ this.value = value; }
}

public class StringAttribute extends AbstractAttribute<String> {
  String value;
  /* ok, you got the point, get/set for value field */
}

تعد أداة Eclipse الخاصة ب AXIS2 سعيدة للغاية لتوليد WSDL من هذه المصادر، بما في ذلك مخطط فئات السمة، والتي هي:

<xs:complexType name="AbstractAttribute">
    <xs:sequence>
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="IntAttribute">
    <xs:complexContent>
        <xs:extension base="xsd:AbstractAttribute">
            <xs:sequence>
                <xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="StringAttribute">
    <xs:complexContent>
        <xs:extension base="xsd:AbstractAttribute">
            <xs:sequence>
                <xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

الآن، إذا أرى شيئا غريباا هنا، فإن التزلجات لا يحتوي على ** مجردة = "True" ** السمة، وحدد عنصر قيمة EySype، والذي يحصل على إعادة كتابة في Intattribute و Stirngattribute. لا أعرف حتى إذا كانت هذه مخطط قانونية (لا أعتقد أنها قانونية، بالمناسبة).

أكثر من ذلك، إذا حاولت إنشاء عميل من هذا WSDL (دائما باستخدام أدوات Eclipse دائما) لن تجميع المصادر التي تم إنشاؤها، لأن التزلج يحدد

Object localValue;

يحدد السمة الميدانية والسلسلة / السلسلة

int localValue;

و

String localValue;

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

لذلك سؤالي هو: هناك طريقة لنموذج شيء مثل نموذج البيانات أعلاه، أو خدمات الويب ومخططات XML "بشكل عام ليست أفضل الأدوات لاستخدامها لهذه الحالة بالذات؟

هل كانت مفيدة؟

المحلول

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

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

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

للإجابة على سؤالك: يمكنك استخدام النموذج الذي لديك أعلاه في التعليمات البرمجية الخاصة بك، لكنك لن تتمكن من استخدام هذه الفئات مع محور. ما فعلناه عادة في مشاريعنا هو:

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

نأمل أن يجيب على سؤالك.

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