0

したがって、グラスフィッシュサーバーで実行され、いくつかのWebメソッドを含むmysqlデータベースに接続するこのWebサービスがあります。

@WebMethod(operationName = "getDrops")
public Dropslog[] getDrops(@WebParam(name = "User") Users user, @WebParam(name = "MonsterID") int monsterID){
    return dbmg.getDrops(user, monsterID);
}

ご覧のとおり、このメソッドは別のクラスからこのメソッドを呼び出すことで、Dropslog[] 型の変数を返します。

public Dropslog[] getDrops(Users user, int monsterID){
    Dropslog drop;
    Criteria criteria = session.createCriteria(Dropslog.class);      

    criteria.add(Restrictions.eq("monsterId", monsterID));
    drop = (Dropslog) criteria.uniqueResult();

    List<Dropslog> drops = (List<Dropslog>) criteria.list();
    Dropslog[] dropsArray = new Dropslog[drops.size()];
    dropsArray = drops.toArray(dropsArray);

    return dropsArray;
}

このメソッドは以前はdropswhich の型を返していましたが、SOAP Web サービスはリストを返せないことをここList<Dropslog>で読んだので変更しました。

クライアント側のアプリケーションは、次のコードを使用して webmethod getDrops を呼び出します。

   public static Dropslog[] getDrops(webservice.Users user, int monsterID){
   webservice.PvmWs service = new webservice.PvmWs();
   webservice.ClientHandler port = service.getClientHandlerPort();
   return port.getDrops(user, monsterID);
  }

したがって、これまで見てきたように、これは完全に機能するはずですが、実際には機能しません。代わりに、最後のメソッドの戻り行にマークされた NetBeans に関する互換性のない型エラーのヒントが表示されます。

incompatible types
required: Dropslog[]
found: List<Dropslog>

驚いたことに、NetBeans が提案するように変更すると、コンパイルして動作します。なぜこれが起こるのか、そして何らかのバグまたはどういうわけかnetbeansが古いファイルを使用してコードをコンパイルしているのか、それともJavaが何らかの自動キャストを行っているのか疑問に思っていましたか?

4

1 に答える 1

1

JAXBの配列のデフォルトの出力タイプはリストです。

私が知っていることから、JAXBには何の違いもList<T>ありArrayません。内部的には、WS操作を次のように宣言します。

public Shape[] echoShapes(Shape[] input)

JAXBはList<Shape>、Unmarshalの結果を保持するインスタンスを作成し、それを使用List.toArray()して配列型に変換します。

OTNディスカッションフォーラム:Webサービス...配列またはリスト..。

于 2013-03-20T00:58:14.993 に答える