Jaxb 如何从XMLAdapter返回SOAPFault?

Jaxb 如何从XMLAdapter返回SOAPFault?,jaxb,jax-ws,jax-ws-customization,Jaxb,Jax Ws,Jax Ws Customization,我正在开发一个基于SOAP的Web服务JAX-WS,日期带有特定的格式yyyymmdd。我的WSDL将日期定义为字符串,但我希望在预期格式后面没有元素值时返回SOAP错误响应。 我已经为元素定义了XMLAdapter,并在解组方法中尝试了以下操作: 公共XMLGregorianCalendar解组字符串值引发异常{ 如果!检查更正格式值{ 抛出新的RuntimeException; } 返回ParseHelper.getInstance.parseStrDateToXMLDatevalue; }

我正在开发一个基于SOAP的Web服务JAX-WS,日期带有特定的格式yyyymmdd。我的WSDL将日期定义为字符串,但我希望在预期格式后面没有元素值时返回SOAP错误响应。 我已经为元素定义了XMLAdapter,并在解组方法中尝试了以下操作:

公共XMLGregorianCalendar解组字符串值引发异常{ 如果!检查更正格式值{ 抛出新的RuntimeException; } 返回ParseHelper.getInstance.parseStrDateToXMLDatevalue; } 但是异常丢失了,Web服务继续运行,为未经授权的元素获取null XMLGregorianCalendar值没有问题。也许这不是实现此格式控制的正确位置。。。
任何帮助都将不胜感激。

考虑在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}可能不像您需要遵守公历的规则那样严格。例如,20121312将不是一个有效的公历日期,因为有,但它仍然会通过您的正则表达式限制。但是你可以通过几个谷歌搜索创建一个符合格雷戈里规则的正则表达式

然后,让JAXWS为您执行模式验证。请参阅在上激活服务端验证

另外,如果您必须使用ccyymdd格式,那么就不能使用xsd:date,在我看来,xsd:date更可取,因为Jaxb将从一开始就为您创建一个java.util.date作为您的财产权。您仍然可以使用自定义的ccyymmdd格式生成java.util.Date,但这需要做更多的工作。你可能会使用一个。类似的内容将进入.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>