我正在开发一个基于SOAP的WebService (JAX-WS),日期带有特定的格式"yyyymmdd“。我的WSDL将日期定义为字符串,但是当预期的格式后面没有元素值时,我想返回一个SOAP错误响应。我已经为元素定义了一个XMLAdapter,并在解组方法中尝试了以下方法:
public XMLGregorianCalendar unmarshal(String value) throws Exception {
if (!checkCorrectFormat(value)){
throw new RuntimeException();
}
return ParseHelper.getInstance().parseStrDateToXMLDate(value);
}但是异常丢失了,WebService继续运行,没有问题地为未编组的元素获取了一个空的XMLGregorianCalendar值。也许这不是实现此格式控件的合适位置……任何帮助都将不胜感激。
发布于 2013-02-07 03:01:22
考虑在您的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将不是有效的公历日期,因为存在no 13th month in the gregorian calendar,但它仍将通过您的正则表达式限制。但是你可以通过几个google搜索来创建一个符合公历规则的正则表达式。
然后,让JAXWS为您做模式验证。请参阅http://www.jroller.com/gmazza/entry/soap_xml_schema_validation上的“激活服务端验证”
此外,如果您必须使用ccyymmdd格式,则不能使用xsd: java.util.Date,在我看来,这会更好,因为Jaxb将从一开始就为您创建一个日期作为您的财产权利。您仍然可以使用自定义的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>
https://stackoverflow.com/questions/14724941
复制相似问题