Как определить класс Java из общего JAXBElement - PullRequest
2 голосов
/ 22 марта 2012

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

В клиенте веб-службы, написанном на 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 Ответ

1 голос
/ 22 марта 2012

Учитывая, что у вас есть что-то вроде этого 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...
...