سؤال

أنا أعمل على خدمة الويب Apache CXF (باستخدام Jax-WS ، فوق الصابون). الخدمة نفسها بسيطة للغاية: تلقي طلبًا ، وأدخل الطلب في قاعدة بيانات ، وإرجاع ما إذا كان الإدراج ناجحًا. أرغب في الاعتماد على التحقق من صحة XML لفرض عدد من القيود على الطلب.

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

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl">
    <jaxws:properties>
        <!-- This entry should- ideally- enable JAXB validation
        on the server-side of our web service. -->
        <entry key="schema-validation-enabled" value="true" />
    </jaxws:properties>
</jaxws:endpoint>

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

لست من ذوي الخبرة الشديدة في هذه المكدس التكنولوجي ، وأدخل في خدمات الويب- أي مؤشرات يمكن أن تعطيني يا رفاق موضع تقدير حقًا.

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

المحلول

يمكنك تجاوز رسائل خطأ التحقق من الصحة ، وإدراج رقم سطر ، باستخدام ValityEventHandler المخصص:

package example;

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.helpers.DefaultValidationEventHandler;

public class MyValidationEventHandler extends DefaultValidationEventHandler {    
    @Override
    public boolean handleEvent(ValidationEvent event) {
        if (event.getSeverity() == ValidationEvent.WARNING) {
            return super.handleEvent(event);
        } else {
            throw new RuntimeException(event.getMessage()
                + " [line:"+event.getLocator().getLineNumber()+"]");
        }
    }
}

إذا قمت بتكوين نقطة النهاية الخاصة بك لاستخدام هذا المعالج:

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl">
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="true" />
        <entry key="jaxb-validation-event-handler">
            <bean class="example.MyValidationEventHandler" />
        </entry>
    </jaxws:properties>
</jaxws:endpoint>

ثم ستحصل على أخطاء الصابون التي تبدو هكذا:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Unmarshalling Error: Not a number: xyz [line: 6]</faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

تمت إضافة خاصية JaxB-Valaction-Event-Enderler فقط إلى CXF مؤخرًا ، لذلك تحتاج إلى التأكد من أنك تستخدم أحدث إصدار-لقد اختبرت ذلك بـ 2.2.5.

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