我正在开发基于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
值。也许这不是实现这种格式控制的正确位置......
任何帮助将不胜感激。
答案 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>