لا يحدث التحقق من صحة مخطط JaxB في رسالة خارجية مع CXF 2.3.1

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

سؤال

باستخدام CXF 2.3.1.

أنشأت جافا من WSDLS باستخدام JaxB.

استخدام

<jaxws:properties>
    <entry key="schema-validation-enabled" value="true" />
</jaxws:properties>

في تكوين العميل.

يختبر اختباري كائنًا يفشل في هذا الشرط بالذات من WSDL:

<xsd:simpleType name="UUID.Content">
    <xsd:annotation>
        <xsd:documentation xml:lang="EN">
            Universally Unique Identifier
            </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
        <xsd:length value="36" />
        <xsd:pattern
            value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
    </xsd:restriction>
</xsd:simpleType>

ومع ذلك ، يتم تنظيم الرسالة وتجعلها على طول الطريق من خلال سلسلة التقاطع الصادرة.

WSDL في اتجاه واحد: الإدخال فقط.

يتم تحديد WSDLLOCITION في التعليق التوضيحي في MESS.

ومن المثير للاهتمام ، يتم حظر الرسائل الواردة التي تفشل في التحقق من صحة هذا القيد نفسه بواسطة سلسلة التقاطع أثناء عدم الممارسين.

أنا أختبر على مدونة الويب. يمكنني أيضًا اختبار WebSphere.

يتم القبض على فشل التحقق من صحة XSD (مثل العنصر المطلوب مفقود) من قبل مارشالر المنتهية ولايته.

السبب في ترقيتنا إلى CXF 2.3.1 من 2.2.6 هو أننا كنا نرى مشكلات مماثلة على الرسائل الواردة. في 2.3.1 ، يحدث التحقق من صحة XSD الكامل للرسائل الواردة ولكن ليس للرسائل الصادرة.

هنا هو الخطأ في CXF:

https://issues.apache.org/jira/browse/cxf-3233

عملنا حول هذا باستخدام org.springframework.xml.validation.xmlvalidator للتحقق من صحة قبل إرسال الرسالة إلى سلسلة اعتراض CXF. آمل أن تستخدم الإصلاحات التي تستخدم سلسلة اعتراض CXF. ومع ذلك ، أظن أن هذا خطأ في CXF.

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

المحلول

لقد واجهت مشاكل مماثلة (CXF 2.2.7) وتمكنت من حلها بإضافة serviceName و endpointName سمات إلى بلدي <jaxws:client> تعريف الفول. تحقق من القسم "تكوين عميل الربيع (الخيار 1)" هنا: https://cwiki.apache.org/cxf20doc/jax-ws-configuration.html لمزيد من المعلومات حول السمات.

ملاحظة: لدي أيضًا wsdlLocation سمة محددة كذلك. من المحتمل أن يكون هذا ضروريًا لـ CXF للعثور على XSDs المستخدمة من قبل الخدمة.

إليك مثال على ما لدي:

<jaxws:client id="client"
              serviceClass="com.example.ServiceInterface"
              address="http://example.com/endpoint"
              wsdlLocation="WEB-INF/wsdl/SampleWSDLFile.wsdl"
              serviceName="s:SampleService"
              endpointName="s:SampleServicePort"
              xmlns:s="http://www.example.com/some/namesapce">
...
</jaxws:client>

لاحظت أيضًا عندما واجهت هذه المشكلة ، تمت طباعة المخطط بأكمله على ملف السجل الخاص بي بواسطة org.apache.cxf.wsdl.EndpointReferenceUtils الفصل في كل مرة تم فيها التذرع العميل. ذهب هذا السلوك بعيدًا عندما أقوم بإعداد حبة العميل مثل تلك المذكورة أعلاه. أتساءل عما إذا كنت ترى شيئًا كهذا أيضًا ...

التفاصيل الأخرى التي يجب أن أذكرها هي أنه كان لدي الكثير من السلوك غير المتوقع من CXF عندما لم أستخدم جميع المكتبات المقدمة من CXF الموضحة في WHICH_JARS ملف. سأحاول أيضًا إضافتها إلى البناء حتى يتمكنوا من تجاوز أي خادم أو مكتبات Java المقدمة. يمكنك دائمًا إزالتها لاحقًا إذا لم تكن ضرورية.

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