我正在使用NetBeans和Glassfish从现有WSDL构建的WebService上工作。
NetBeans从给定的WSDL中创建了所需的类。
WSDL定义了一些基本数据类型(例如BaseType)和扩展它们的其他数据类型。 (例如ExtType1,ExtType2 ...)
WSDL中描述的某些SOAP函数接受BaseType类型的参数,因此也可以使用扩展类型作为参数。

在用PHP编写的Web服务客户端中,我可以使用基本类型参​​数调用方法:

$response = $ws->__soapCall(
    'myFunctionName',
    array('theParameter' => array (
              'BaseTypeField1' => 'some value',
              'BaseTypeField2' => 'some other value'
         )
    )
);


或使用扩展类型参数

$response = $ws->__soapCall(
    'myFunctionName',
    array('theParameter' => array (
              'BaseTypeField1' => 'some value',
              'BaseTypeField2' => 'some other value',
              'ExtTypeField1' => 'some value',
              'ExtTypeField2' => 'some other value'
         )
    )
);


现在在netbeans生成的类中,我有一个JAXBElement ,在其中应该有BaseType对象。

问题是:如何从Java Web方法调用中确定来自Web服务客户端的参数对象是BaseType还是其扩展类型中的一种(或其中一种)?
我试图检索该对象的一些类数据信息,但是它总是说这是一个BaseType,所以我不知道ExtTypeField1和ExtTypeField2是否确实可用。

谢谢

最佳答案

假设您具有类似JAXBElement<? extends BaseType> object的内容,则可以按以下方式确定值的类型:

Class<? extends BaseType> klass = object.getValue().getClass();


现在,您可以根据对象类型执行某些操作,但这并不总是最好的方法。您可能想要的更多是这样的东西:

BaseType value = object.getValue();
if (value instanceof ExtType1) {
    ExtType1 field1 = (ExtType1) value;
    // we now know that it's an ExtType1
} else if (value instanceof ExtTypeField2) {
    ExtType2 field2 = (ExtType2) value;
    // we now know that it's an ExtType2
} // etc...

10-04 17:31