2012-03-22 3 views
2

Я работаю над WebService, созданным из существующего WSDL, используя NetBeans и Glassfish. NetBeans создал необходимые классы из данного WSDL. WSDL определяет некоторые базовые типы данных (например BaseType) и другие типы данных, которые расширяют их. (например, ExtType1, ExtType2 ...) Некоторые из функций SOAP, описанных в WSDL, принимают параметры типа BaseType, поэтому также возможно использовать расширенные типы в качестве параметров.Как определить класс java из общего JAXBElement <? extends >

В клиенте веб-службы, написанный на PHP, я могу вызвать метод с использованием параметра базового типа:

$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 <? extends BaseType >, где ожидается объект BaseType.

Вопрос в том, как определить, изнутри вызова веб-метода Java, если объект параметра от клиента веб-службы является базовым типом одного или одного из его расширенных типов (и какой из них)? Я попытался получить некоторую информацию данных класса для этого объекта, но он всегда говорит, что это 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

Ммм, я просто пытался что-то вроде Class klass = object.getValue(). getClass(); но как я могу определить, является ли klass BaseType или ExtType1? Он всегда говорит BaseType ... – Angelo

+0

Вы читали мое второе предложение? В любом случае, если ваш класс говорит, что это «BaseType», то это «BaseType», а не «ExtType1» или «ExtTypeX» (если «ExtType1» не является супертипом «BaseType»). –

+0

Хорошо, это говорит о «BaseType». Таким образом, с клиентской стороны веб-службы PHP, что вызов функции веб-службы только с полями BaseType или даже с полями «ExtType» не имеет никакого значения, на стороне Java, и я всегда получаю «BaseType» '... Я не очень хорошо понимаю ваш второй подход. 'ExtTypeField1' и' ExtTypeField2' являются членами 'ExtType', так как может' value instanceof ExtTypeField1' когда-либо работать? – Angelo

Смежные вопросы