必需<的文档/a> 说:
如果 required()
是
true
,则 Javabean 属性映射到 XML 模式元素
使用 minOccurs="1"
进行声明。对于单值,maxOccurs
为 "1"
属性和多值属性的“unbounded”
。
如果 required()
为 false
,则 Javabean 属性将映射到 XML
使用 minOccurs="0"
声明架构元素。 maxOccurs
为 "1"
单值属性和多值属性的“无界”
。
nillable< 的文档/a> 说:
如果 nillable()
为 true
,则 JavaBean 属性将映射到 XML
架构 nillable
元素声明。
Code for
xs:complexType
:
public class WSData {
//...
@XmlElement(required = true, nillable = false)
public void setMonth(XmlMonthType month) {
this.month = month;
}
public void setUserLogin(String userLogin) {
this.userLogin = userLogin;
}
}
xs:simpleType
的代码:
@XmlType
@XmlEnum(Integer.class)
public enum XmlMonthType {
@XmlEnumValue("1")
JANUARY,
@XmlEnumValue("2")
FEBRUARY,
@XmlEnumValue("3")
MARCH,
/* ... months 4 ~9 ... */
@XmlEnumValue("10")
OCTOBER,
@XmlEnumValue("11")
NOVEMBER,
@XmlEnumValue("12")
DECEMBER;
}
生成的 XML 架构:
<xs:complexType name="wsData">
<xs:sequence>
<xs:element name="month" type="xs:string"/>
<xs:element minOccurs="0" name="userLogin" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="xmlMonthType">
<xs:restriction base="xs:int">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<!-- ... months 4 ~9 ... -->
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
</xs:restriction>
</xs:simpleType>
The facts:
- minOccurs 的默认值为 1。因此,month 是必需的(必须存在);
- 该月份有限制。因此,month 只能具有由 12 个定义的枚举之一定义的值;
- nillable 的默认值为 false。因此,月份不能有空值;
- XML 架构已正确生成。
问题:
- 它正在接受月份的 abcense(必须不存在);
- 它接受任何月份值,例如 13(除非无法解析为整数);
- 它接受空值;
我没想到会出现这些问题,我错过了什么吗?
如果该行为正确,必需,可空和 xs:限制?
Documentation for required says:
If required()
is
true
, then Javabean property is mapped to an XML schema element
declaration with minOccurs="1"
. maxOccurs
is "1"
for a single valued
property and "unbounded"
for a multivalued property.
If required()
is false
, then the Javabean property is mapped to XML
Schema element declaration with minOccurs="0"
. maxOccurs
is "1"
for a
single valued property and "unbounded"
for a multivalued property.
Documentation for nillable says:
If nillable()
is true
, then the JavaBean property is mapped to a XML
Schema nillable
element declaration.
Code for
xs:complexType
:
public class WSData {
//...
@XmlElement(required = true, nillable = false)
public void setMonth(XmlMonthType month) {
this.month = month;
}
public void setUserLogin(String userLogin) {
this.userLogin = userLogin;
}
}
Code for xs:simpleType
:
@XmlType
@XmlEnum(Integer.class)
public enum XmlMonthType {
@XmlEnumValue("1")
JANUARY,
@XmlEnumValue("2")
FEBRUARY,
@XmlEnumValue("3")
MARCH,
/* ... months 4 ~9 ... */
@XmlEnumValue("10")
OCTOBER,
@XmlEnumValue("11")
NOVEMBER,
@XmlEnumValue("12")
DECEMBER;
}
Generated XML Schema:
<xs:complexType name="wsData">
<xs:sequence>
<xs:element name="month" type="xs:string"/>
<xs:element minOccurs="0" name="userLogin" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="xmlMonthType">
<xs:restriction base="xs:int">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<!-- ... months 4 ~9 ... -->
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
</xs:restriction>
</xs:simpleType>
The facts:
- The default value for minOccurs is 1. So, month is required (must exist);
- The month has a restriction. So, month can only have a value defined by one of the 12 defined enumerations;
- The default value for nillable is false. So, month can't have empty values;
- The XML Schema is generated correctly.
The problems:
- It is accepting month's abcense (mustn't exist);
- It is accepting any values for month, like 13 (except when isn't parseable to Integer);
- It is accepting empty values;
I wasn't expecting these problems, am I missing something?
If that behavior is correct, what is the purpose of required, nillable and xs:restriction?
发布评论
评论(5)
Nillable 允许空值。例如,如果您有一个 Integer 或 Date,如果它可以为空,则 XML 标记可以为空。如果它不是可为空但不是必需的,则 XML 元素要么必须以有效内容存在,要么根本不存在;空标签无效。
Nillable allows empty values. For example, if you have an Integer or a Date, if it's nillable, the XML tag could be empty. If it's not nillable but not required, the XML element would either have to exist with a valid content, or not exist at all; an empty tag wouldn't be valid.
minOccurs
的默认值为 1,因此month
元素是必需的。请注意如何将minOccurs="0"
添加到userLogin
中以使其成为可选。您可以在 Unmarshaller 上设置
Schema
实例来验证输入:演示
以下代码可用于生成 XML 模式:
UPDATE
JAXB RI 通常会因转换问题引发严重性为 1 的
ValidationEvent
。默认的 ValidationEventHandler 会忽略严重性小于 2 的所有问题。这通常会导致该值设置为 null。您可以按如下方式重写ValidationEventHandler
:但是,JAXB RI 似乎不会抛出与转换枚举值相关的事件(可能是错误)。如果您碰巧使用 EclipseLink JAXB (MOXy) 作为 JAXB 提供程序,那么您将收到如下异常:
了解更多信息
The default value for
minOccurs
is one, so themonth
element is required. Note howminOccurs="0"
had to be added touserLogin
to make it optional.You can set an instance of
Schema
on the Unmarshaller to have the input validated:Demo
The following code can be used to generate the XML schema:
UPDATE
The JAXB RI normally throws a
ValidationEvent
of severity 1 for conversion issues. The defaultValidationEventHandler
ignores all issues of severity less than 2. This normally results in the value being set to null. You can override theValidationEventHandler
as follows:However the JAXB RI does not appear to throw events related to converting enum values (possible bug). If you happen to be using EclipseLink JAXB (MOXy) as your JAXB provider then you will get an exception like:
For More Information
required
和minOccurs
的目的并没有误导,问题是未启用架构验证。只需启用SchemaValidation
到WebService
并定义顺序XmlType
的映射如下:Web Service:
XmlType:
The purposes of
required
andminOccurs
aren't mislead, the problem is that the schema validation is not enabled. Just enableSchemaValidation
to theWebService
and define the order of theXmlType
's mapping as follows:Web Service:
XmlType:
事实上,SOAP 信封似乎没有在 WSDL 上进行验证,无论是在服务器还是客户端上。
我认为这样最好。验证消耗资源和时间。对于大多数 WebServices,我们所需要的 WSDL 就是向客户端提供能够与 WebService 通信的定义,而不是设置诸如属性是否可以为 null 之类的限制。
当服务器和客户端位于同一台 PC 上时,Axis2 与内部调用相比会增加 3-5 毫秒的开销。不必要的验证只会增加开销。我最好让操作抛出异常并手动验证真正需要的内容。
Indeed it seems that SOAP envelopes aren't validated upon WSDL, neither on server or client.
And I think it's best this way. Validation consumes resources and time. For most WebServices, all we need with WSDL is to provide to client the definitions to be able to talk to WebService, and not set restrictions like if a property can or not be null.
When server and client are on same PC, Axis2 add 3-5 milisecs of overhead compared to internal calls. Unecessary validation would only increase overhead. I's better to make operations throw an exception and manually validate what's really needed.
我查看了您发布的 XSD 结构 - 发现您没有使用为该月定义的复杂类型,在 Java 代码上处理它的 Insteqad 您可以在 XSD 中提及所有内容,以及月份的 minOccur -您的复杂类型中缺少元素。请使用任何标准的XSD to java生成器,它将为您完成所有java文件生成任务
I looked into the XSD structure that you have posted - and find that you have not used complex type that you have defined for the month , Insteqad of handling it on java code you can mention that all in XSD , and also the minOccur on month - element in your complex type is missing . Please use any standered XSD to java generator , it will do all the java file generation task for you