2012-03-22 21 views
2

我正在使用NetBeans和Glassfish從現有的WSDL構建WebService。 NetBeans從給定的WSDL創建了所需的類。 WSDL定義了一些基本數據類型(例如BaseType)和擴展它們的其他數據類型。 (例如ExtType1,ExtType2 ...) WSDL中描述的一些SOAP函數接受BaseType類型的參數,因此也可能使用擴展類型作爲參數。如何從泛型JAXBElement中檢測java類<? extends >

$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的類:

在Web服務客戶端,寫在PHP,我可以使用鹼型參數調用一個方法我有一個JAXBElement類型的對象<?擴展BaseType >,其中需要一個BaseType對象。

現在的問題是:如何從Java Web方法調用中確定Web服務客戶端的參數對象是BaseType一個還是一個擴展類型(以及哪些擴展類型)? 我試圖檢索該對象的某些類數據信息,但它總是說它是一個BaseType,所以我不知道ExtTypeField1和ExtTypeField2是否可用。

感謝

回答

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... 
+0

嗯,我剛纔試過類似 類<?擴展BaseType> klass = object.getValue()。getClass(); 但我怎麼能確定如果klass是BaseType或ExtType1?它總是說BaseType ... – Angelo 2012-03-22 17:24:24

+0

你讀過我的第二個提議嗎?無論哪種方式,如果你的klass表示它是'BaseType',那麼它就是'BaseType',而不是'ExtType1'和'ExtTypeX'(除非'ExtType1'是一個超類型的'BaseType')。 – 2012-03-22 17:31:46

+0

好的,它是一個'BaseType'。因此,從PHP Web服務客戶端看來,只使用'BaseType'字段或甚至使用'ExtType'字段調用Web服務函數在Java端沒有任何區別,並且我總是獲得一個'BaseType '... 我不明白你的第二種方法。 'ExtTypeField1'和'ExtTypeField2'是'ExtType'的成員,那麼'instanceof ExtTypeField1'這個值怎麼能工作呢? – Angelo 2012-03-22 17:39:13

相關問題