2012-03-22 4 views
2

NetBeansとGlassfishを使用して、既存のWSDLから構築されたWebServiceで作業しています。 NetBeansは、指定されたWSDLから必要なクラスを作成しました。 WSDLは、いくつかの基本データ型(BaseTypeなど)とそれを拡張する他のデータ型を定義します。 (例えば、ExtType1、ExtType2 ...) WSDLに記述されているSOAP関数の中には、BaseType型のパラメータを受け付けるものがあるため、拡張型をパラメータとして使用することもできます。 PHPで書かれたWebサービスクライアントでは、一般的なJAXBElementからJavaクラスを検出する方法<? extends >

、私は基本型パラメータを使用してメソッドを呼び出すことができます。

$response = $ws->__soapCall(
    'myFunctionName', 
    array('theParameter' => array (
       'BaseTypeField1' => 'some value', 
       'BaseTypeField2' => 'some other value' 
     ) 
    ) 
); 

やNetBeansの生成されたクラスで今

$response = $ws->__soapCall(
    'myFunctionName', 
    array('theParameter' => array (
       'BaseTypeField1' => 'some value', 
       'BaseTypeField2' => 'some other value', 
       'ExtTypeField1' => 'some value', 
       'ExtTypeField2' => 'some other value' 
     ) 
    ) 
); 

拡張型パラメータを使用して、私はタイプJAXBElement <のオブジェクトを持っていますか?ベースタイプ>を拡張します。ここでは、BaseTypeオブジェクトが必要です。

質問:Java Webメソッド呼び出し内から、WebサービスクライアントのパラメータオブジェクトがBaseTypeの1つまたは拡張型(およびそれらのいずれか)であるかどうかを確認するにはどうすればよいですか? 私はそのオブジェクトのいくつかのクラスデータ情報を取得しようとしましたが、常にBaseTypeだと言われていますので、ExtTypeField1とExtTypeField2が利用可能かどうかはわかりません。

あなたは次のように値の型を決定することができ、このJAXBElement<? extends BaseType> objectのようなものを持っていることを考えると感謝

答えて

1

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

+0

私の2番目の命題を読んだことがありますか?いずれにしても、あなたのklassが 'BaseType'と言っているなら、' ExtType1'が 'BaseType'のスーパータイプでない限り' ExtType1'でも 'ExtTypeX'でもなく' BaseType'です。 –

+0

さて、それは 'BaseType'と言います。だから、PHPのWebサービスクライアント側からは、 'BaseType'フィールドだけで、あるいは' ExtType'フィールドでもWebサービス関数を呼び出すとJava側で何の違いもなくなり、常にBaseType '... 私はあなたの第2のアプローチをよく理解していません。 'ExtTypeField1'と' ExtTypeField2'は 'ExtType'のメンバーですので、' value instanceof ExtTypeField1'はどのように動作しますか? – Angelo