JAXWS / JAXB检查对象是否为空(不是字符串)

时间:2011-07-11 14:37:38

标签: java jaxb jax-ws

对于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堆栈。这是一个遗憾,因为这对我的问题是一个很好的解决方案,但现在不可能。

有没有人知道检查元素是否为空的方法? (我重复一遍,它是一个复杂的类型,而不是一个字符串)。枚举属性并自动检查它们吗?

感谢。

2 个答案:

答案 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
}

这极大地简化了您的代码。