1

我正在开发一个基于 SOAP 的 WebService (JAX-WS),日期带有特定格式“yyyymmdd”。我的 WSDL 将日期定义为字符串,但我想在预期格式后面没有元素值时返回 SOAP 错误响应。我已经定义了一个XMLAdapterfor 元素并在 unmarshall 方法中尝试了以下操作:

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

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

但是异常丢失了,WebService 继续XMLGregorianCalendar为未编组的元素获取空值没有问题。也许这不是实现此格式控制的正确位置...任何帮助将不胜感激。

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 回答