1

私はSOAPベースのWebサービス(JAX-WS)を開発しており、日付は特定の形式「yyyymmdd」で提供されます。私のWSDLは日付を文字列として定義していますが、期待される形式の後に要素値が続かない場合に、SOAP障害応答を返したいと思います。for要素を定義しXMLAdapter、unmarshallメソッドで次のことを試しました。

public XMLGregorianCalendar unmarshal(String value) throws Exception {
    if (!checkCorrectFormat(value)){
        throw new RuntimeException();
    }

    return ParseHelper.getInstance().parseStrDateToXMLDate(value);
}

ただし、例外は失われ、WebServiceはXMLGregorianCalendar、マーシャリングされていない要素のnull値を問題なく取得し続けます。おそらく、これはこのフォーマット制御を実装するのに適切な場所ではありません...どんな助けもいただければ幸いです。

4

1 に答える 1

0

xsdにこの正規表現制限を実装することを検討してください。

  <xsd:simpleType name="MySpecialDate">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="\d{4}\d{2}\d{2}"/>
      <xsd:whiteSpace value="collapse"/>
    </xsd:restriction>
  </xsd:simpleType>

\ d {4}-\ d {2}-\ d {2}は、グレゴリオ暦の規則に従う必要があるほど厳密ではない場合があります。たとえば、2012 13 12は、グレゴリオ暦に13か月目がないため、有効なグレゴリオ暦の日付ではありませんが、正規表現の制限を通過します。しかし、いくつかのグーグル検索でグレゴリオ暦の規則に準拠する正規表現を確実に作成できます。

次に、JAXWSにスキーマ検証を実行させます。http://www.jroller.com/gmazza/entry/soap_xml_schema_validationの「サービス側の検証をアクティブ化するには」を参照してください。

また、ccyymmdd形式を実行する必要がある場合は、xsd:dateを使用できません。これは、Jaxbが最初からプロパティとしてjava.util.Dateを作成するため、私の考えでは望ましいことです。カスタムccyymmdd形式でこれ(java.util.Dateの生成)を実現することはできますが、もう少し手間がかかります。おそらくjaxbカスタムバインディングを使用するでしょう。このようなものが.jxbファイルに入り、xjcタスクで使用されます。

<jxb:bindings node="//xs:simpleType[@name='MySpecialDate']">
  <jxb:javaType name="java.util.Date"
        parseMethod="com.company.DateConverter.parseMySpecialDate" 
        printMethod="com.wpsic.tricare.ws.converter.DateConverter.printMySpecialDate" />
</jxb:bindings>

于 2013-02-06T19:01:22.050 に答える