web-dev-qa-db-ja.com

JAX-WSコードファーストアプローチでスキーマに対してSOAPリクエストを検証する

一部のリクエストフィールドでJAXBアノテーションを使用して、それらを必須にするJAX-WSWebサービスを作成しました。

@XmlElement(required = true)
protected String number;

Cxf-Java2ws-pluginによって生成されたWSDLは正しく、フィールドにminOccurs="0"はありません:

<xs:element name="number" type="xs:string"/>

ただし、サービスがこれらの制約を尊重しない要求(フィールドの欠落)を受信した場合、SoapFaultまたは例外はスローされません。

また、WSクラスに@SchemaValidationを追加しようとしましたが、効果はありませんでした。

Schmemaに対するリクエストの検証(またはアノテーションベースの制約に対する検証)を自動化するにはどうすればよいですか?

11
kgautron

MinOccursのデフォルト値は1です。したがって、値が存在している必要があります。
nillableのデフォルト値はfalseです。したがって、値を空にすることはできません。
そして、Webサービスでスキーマ検証をアクティブ化しました。

@WebService
@SchemaValidation(enabled = true)
public class MyService {
//...
}

そして、最後になりましたが、結果のスキーマができました。

ただし、JAXBリファレンス実装は検証を行いません。

Java Xml Validation API を使用して、これを自分で行う必要があります。

ここにスキーマ検証の簡単な例があります

public class XmlSchemaValidation {

    public static void main(String[] args) throws Exception {
        Something myObject = new Something();
        validate(myObject);
    }
    public static void validate(Something myObject) throws Exception {

        Schema s = SchemaFactory
                   .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
                   .newSchema(new File("Something.xsd"));

        Validator validator = s.newValidator();
        //You can set an error handler
        //validator.setErrorHandler(errorHandler);
        validator.validate( new JAXBSource(JAXBContext.newInstance(Something.class), myObject));
    }

}
4
Gren

問題を解決できない場合は、2つの回避策を提案します。

  1. JAXBアンマーシャリング後にBeanを検証します
  2. CXF検証機能を使用する

JAXBアンマーシャリング後の検証

JavaリクエストBean( ここで説明 )にJAXBコールバックafterUnmarshal()を追加し、必要なすべての検証を実行できると思います(フォーマット検証、または他の人)。

例えば ​​:

@XmlRootElement
public class YourRequest {

    @XmlElement(required = true)
    protected String number;

    // some code here

    public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
       if(number == null) {
           // Throw validation exception
       }
    }

}

CXF検証機能

もう1つの可能性は、CXFでBean Validationを使用することです( ここに記載されているように )。通常、スキーマベースの検証には必要ありませんが、スキーマベースの検証よりも複雑な検証が必要な場合は、結局のところ、問題の解決策になると思います。

より良い答えを待っている間、それがあなたを助けることができることを願っています。

2
KevinHol

Jaxb2-maven-pluginなどのツールを使用して、JAXBクラスを生成します。ペイロードをWebServiceに送信する前、またはJSR303仕様を使用してシステムにペイロードを受け入れる前に検証します。 ここをクリック JSR303バリデーターを表示します。

これにより、システムが堅牢になります。

1
sitakant