【发布时间】:2016-05-27 16:51:23
【问题描述】:
我必须在 Java 8 Web 服务 (JAX-WS RI) 中处理大请求。一个请求包含一个“标头”和许多这样的“记录”(不是第 2、3、4、5 个学生记录根据架构无效):
<helloStudentsServiceRequest>
<workshop>
<name>wsname</name>
<tutor>tutorname</tutor>
</workshop>
<studentList>
<!--1 or more repetitions: -->
<student>
<Name>st1</Name>
<Birth>1999-11-11</Birth>
</student>
<student>
<Name>st2</Name>
</student>
<student>
<Name>st2</Name>
<Birth>199O-11-11</Birth>
</student>
<student>
<Name>st3</Name>
<Birth>stoneage</Birth>
</student>
<student>
<Birth>stoneage</Birth>
</student>
<student>
<Name>st6</Name>
<Birth>2001-11-12</Birth>
</student>
</studentList>
</helloStudentsServiceRequest>
我使用模式 (XSD) 来描述我的界面。例如:
<xsd:complexType name="HelloStudentsServiceRequestType">
<xsd:sequence>
<xsd:element name="workshop" type="WorkshopType" />
<xsd:element name="studentList">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="student" type="StudentType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="WorkshopType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="tutor" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="StudentType">
</xsd:annotation>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string" />
<xsd:element name="Birth" type="xsd:date" />
</xsd:sequence>
</xsd:complexType>
我想使用此架构来验证请求。
但是,如果其中的一些“记录”根据架构无效,我不允许拒绝请求。在这种情况下,我必须处理有效记录并返回一些关于无效记录的有意义的信息(最好是 SAX 错误)。
我想让请求的架构不包含完成此“延迟验证”所需的技术细节。例如我不想使用“大字符串”来保存“记录”,然后根据架构验证该字符串。这会破坏界面并且难以与客户沟通。所以这对我来说是不行:
...
<xsd:element name="studentList">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="student" type="xsd:string" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
...
您知道在 JAX-WS RI (JAXB2) 中解决此问题的优雅方法吗?
【问题讨论】:
标签: java web-services validation xsd lazy-evaluation