对于Web服务,我从WSDL / XSD生成对象。典型的XML就像:
<Document>
...
<Destination>
<Type>Person</Type>
<Name>Someone</Name>
<Address>
<Street>Main Street</Street>
<City>Foo</City>
</Address>
</Destination>
...
</Document>
因此,当指定Destination时,我必须根据许多规则对其进行验证:
if (document.getDestination() != null) {
... check validity
}
然而,有人通过了:
<Destination/>
它不再是空的,我的验证拒绝它。我想写一下:
if (document.getDestination() != null && !document.isEmpty()) {
... check validity
}
我不喜欢检查每个子元素的存在的想法,因为我会在某个时候错过一个并创建奇怪的错误。 我在EclipseLink MOXy实现中看到了XMLNullRepresentationType,但我正在使用Sun WebService堆栈。这是一个遗憾,因为这对我的问题是一个很好的解决方案,但现在不可能。
有没有人知道检查元素是否为空的方法? (我重复一遍,它是一个复杂的类型,而不是一个字符串)。枚举属性并自动检查它们吗?
感谢。
答案 0 :(得分:3)
您可以在WebService端点上使用JAX-WS @SchemaValidation
注释来强制针对提供的架构验证请求。如果您定义Destination元素的子元素是必需元素,那么省略它们将无法通过模式验证。
您可以在@SchemaValidation
上插入自己的错误处理程序,向用户报告错误消息。
答案 1 :(得分:2)
从XSD / WSDL生成JAXB / JAXWS对象时,可以使用JAXB自定义工具告诉JAXB编译器为Java对象添加“isSet”方法。
我通常在所有JAXB / JAXWS生成任务中包含一个带有此JAXB自定义的文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jxb:bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
targetNamespace="http://java.sun.com/xml/ns/jaxb"
version="1.0">
<jxb:globalBindings
generateIsSetMethod="true"
/>
</jxb:bindings>
假设您在名为“jaxb_global_customization.jxb”的文件中包含此XML,则可以在生成步骤中包含此XML:
<wsimport
sourcedestdir="${dao.dir}/build/generated"
destdir="${dao.dir}/build/bin/generated"
wsdl="${dao.dir}/src/resources/schema/dao/SomeService.wsdl"
wsdlLocation="./wsdl/SomeService.wsdl"
>
<binding dir="${dao.dir}/src/resources/schema/" includes="*.xml"/>
<binding dir="${dao.dir}/src/resources/schema/" includes="*.xsd"/>
<binding dir="${dao.dir}/src/resources/schema/" includes="*.jxb"/>
</wsimport>
或使用XJC任务:
<xjc destdir="${dao.dir}/build/generated" package="com.example.dao">
<schema dir="${dao.dir}/src/resources/schema" includes="*.xsd" />
<binding dir="${dao.dir}/src/resources/schema" includes="*.jxb" />
</xjc>
在生成的示例代码中,JAXWS / JAXB生成的代码将包含如下方法:
if (document.isSetDestination()) {
// here you know that if Destination is a complex type, that the object which represents Destination is not null
// if destination is a simple type, you know that it is not null and that it is not empty (meaning Destination != null && Destination.length() >0
// if Destination is a repeating type, you know that it is not null and if it has any elements in it (ie, it's present and not an empty list)
... check validity
}
这极大地简化了您的代码。