我正在使用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...