一部のリクエストフィールドで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に対するリクエストの検証(またはアノテーションベースの制約に対する検証)を自動化するにはどうすればよいですか?
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));
}
}
問題を解決できない場合は、2つの回避策を提案します。
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
}
}
}
もう1つの可能性は、CXFでBean Validationを使用することです( ここに記載されているように )。通常、スキーマベースの検証には必要ありませんが、スキーマベースの検証よりも複雑な検証が必要な場合は、結局のところ、問題の解決策になると思います。
より良い答えを待っている間、それがあなたを助けることができることを願っています。
Jaxb2-maven-pluginなどのツールを使用して、JAXBクラスを生成します。ペイロードをWebServiceに送信する前、またはJSR303仕様を使用してシステムにペイロードを受け入れる前に検証します。 ここをクリック JSR303バリデーターを表示します。
これにより、システムが堅牢になります。