如何从XMLAdapter返回SOAPFault?

时间:2013-02-06 08:51:09

标签: jaxb jax-ws jax-ws-customization

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

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

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

但是异常丢失并且WebService继续运行而没有问题为unmarshalled元素获取null XMLGregorianCalendar值。也许这不是实现这种格式控制的正确位置...... 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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将不是有效的格里高利日期,因为有no 13th month in the gregorian calendar但它仍然会通过您的正则表达式限制。但是你可以创建一个符合格里高利规则的正则表达式,并进行一些谷歌搜索。

然后,让JAXWS为您进行架构验证。请参阅http://www.jroller.com/gmazza/entry/soap_xml_schema_validation

上的“激活服务端验证”

另外,如果你必须使用ccyymmdd格式,你不能使用xsd:date,在我看来,这将是更好的,因为Jaxb将从一开始就为你的属性创建一个java.util.Date。您仍然可以使用自定义ccyymmdd格式实现此目的(生成java.util.Date),但这是一个更多的工作。您可能会使用jaxb custom binding。这样的东西会进入.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>

相关问题