0

WCF Web サービスを使用しようとしています。

<cfdump>関数を次のように示します

getVwEmpByLocs(com.microsoft.schemas._2003._10.serialization.arrays.ArrayOfint)

アップデート:

<cfset wsUser = createobject("webservice", "http://xxxxxxx/cardService.svc?wsdl")>
<cfdump var="#wsUser#">

<cfset locationID = []>
<cfset locationID[1] = 2092>
<cfset stResult = wsUser.GetVwEmpByLocs(javacast('int[]', locationID))>

エラー:

Message argument type mismatch

4

3 に答える 3

1

まず、サービスの WSDL オブジェクトを調べて、オブジェクトがどのようにシリアライズされたかを調べます。ArrayOfInt.cfc という cf コンポーネント名を作成します

component  displayname="ArrayOfint"
{
    property name="int" type="Array" notnull="True" getter="false" setter="false";
    this['int'] = ArrayNew(1);
    function init(){  return this; }
}

このような値を渡します

arrOfInt = createobject('component','ArrayOfInt').init();
arrOfInt.int[1] = 100;
arrOfInt.int[2] = 200;
getVwEmpByLocs(arrOfInt)
于 2013-01-03T21:08:41.350 に答える
1

@Leigh からのコメントと少し Google を読んだ後、ColdFusion Web サービスのデバッグに関する次の記事を見つけました。この質問 (および @Leigh が参照していたもの) で特に興味深いのは、番号 2 の下 (ページの下部に向かって) の箇条書き項目です。参照されたページが削除された場合に備えて、その情報をここに含めます。

引数の型としてまたはを指定java.lang.IllegalArgumentException: argument type mismatchして .Net Web サービスを呼び出すのに時間がかかる場合は、データ型を正しく定義していない可能性があります。andは、.Net が配列を予期していると信じ込ませるでしょう。ただし、ColdFusion 配列は .Net 配列と同じではないことに注意してください。wsdl を注意深く見ると、が complexType 名として定義されていることがわかります。ArrayOfIntArrayOfStringArrayOfIntArrayOfStringArrayOfInt

<s:complexType name="ArrayOfInt">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" />
</s:sequence>
</s:complexType>

また、CF の複合型は構造体にマップされます。さらに、この複合型には name="int" の要素があることがわかります。Java が wsdl を参照してスタブ クラス ファイルを作成すると、この要素の名前が「_int」に変更されます。「int」はJavaの予約語であり、ネイティブデータ型でもあるため、これを行っていると思います。つまり、.Net Web サービスを正常に呼び出すには、次のものが必要です。

<cfset objGroupIds = StructNew()>
<cfset objGroupIds._int = ListToArray("627303")>
<cfset callResult = myObj.getUser(objGroupIds)>
于 2013-01-04T17:15:04.087 に答える
0

参照の観点から役立つかもしれないいくつかのこと...

http://msdn.microsoft.com/en-us/library/kskex131%28v=vs.90%29.aspx 配列データ型は、実際には .Net の Array オブジェクトでは事前定義されていませんが、配列要素のデータ型によって定義されています。 .

http://msdn.microsoft.com/en-us/library/ff690589%28v=sql.105%29.aspx これは、配列パラメーターに含めることができるデータ型を定義する基本的なスキーマです (たとえば、ArrayOfInt)。これは、wsdl スキーマによって定義されているようです。

テストできずにストローをつかみます。値を特定のインデックスに割り当てようとする代わりに、暗黙的な配列を作成して渡すとどうなりますか。他の問題は、配列を Java int データ型にキャストしようとしている可能性があります...これが機能するかどうかはわかりません。値を配列に代入するときにキャストを実行したい場合があります。

<cfset stResult = wsUser.GetVwEmpByLocs([2092])>
or
<cfset locationID = [2092]>
<cfset stResult = wsUser.GetVwEmpByLocs(locationID)>
于 2013-01-04T13:01:14.530 に答える