如何从通用JAXBElement <! - 中检测java类?延伸 - >

时间:2012-03-22 17:01:46

标签: java web-services soap jaxb glassfish

我正在使用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类型的对象&lt;?扩展BaseType&gt;,其中需要BaseType对象。

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

由于

1 个答案:

答案 0 :(得分:1)

鉴于您有类似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...