2

カスタム オブジェクトをクライアントに転送する際に問題が発生しています。カスタム オブジェクトをクライアントに転送し、それを Web サービスに戻すにはどうすればよいですか? ファイルをチャンク単位で転送しています。クライアントの書き方を知りたいです。クライアントと同じように渡そうとしMediaType.APPLICATION_JSONましたが、結果が得られず、Web サービスに戻されません。以下は、私が取り組んでいるコードの一部です。

ウェブサービス

 @POST
    @Path("/fileTransfer")
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_JSON})
    public final TransferInfomation transferInfo(final FileModel file)
{
...
}

...(いくつかのコード)(sysoとだけ言っておきましょう)

FileModel クラス

public class FileModel {

private String fileID;
private DataHandler dataHandler;

/**
 * Constructor.
 */
public FileModel() {
}

(セッターとゲッターが作成されたと仮定しましょう)

(Webサービスが正しいかどうかはわかりません)。まだRESTを学んでいるので、クライアントがどうあるべきか知りたいです。

前もって感謝します。

4

3 に答える 3

3

Jersey で「カスタム オブジェクト」(JSON、XML など) を「整列化」および「非整列化」する良い方法は、JAXB ( https://jaxb.java.net/ ) を使用することです。

これを行うには、適切なゲッターとセッター (および注釈) を使用して「jaxb クラス」を作成する必要があります。次に例を示します。

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class FileModel{

    private String fileID;
    private DataHandler dataHandler;

    public String getFileID(){
        return fileID;
    }

    public void setFileID(String fileID){
        this.fileID = fileID;
    }

    public DataHandler getDataHandler(){
        return dataHandler;
    }

    public void setDataHandler(DataHandler dataHandler){
        this.dataHandler = dataHandler;
    }

}

を宣言することを忘れないでください@XmlRootElement。次に、API エンドポイント (メソッド) でこれらのオブジェクトを宣言して使用するだけです。

@POST
@Path("/fileTransfer")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public final FileModel transferInfo(FileModel file)
{
    // read file in "FileModel" format
    // ... make several operations
    // return new FileModel (or another format if you will)
}

これはうまくいくはずです。クライアント側で FileModel に対して定義されたデータ構造に正しく従っていることを確認してください。Jersey でそれを処理する方法の例を参照してください: How do I POST a Pojo with Jersey Client without manually convert to JSON? (JAXBも使用されます)。

于 2013-10-14T07:59:12.210 に答える
2

REST エンドポイントは、JSON を使用して生成することを示しています。したがって、REST クライアントは に逆シリアル化できる JSON を送信する必要がFileModelあり、TransferInfomation返されたtransferInfoを JSON にシリアル化してクライアントに返す必要があります。

通常、 RESTEasyRestletCamelSpring MVCなどの Java REST フレームワークは、Jacksonなどの JSON シリアライザー/デシリアライザーと JSON <--> Java からのマッピング ルールを定義できる機能を提供し、フレームワークが詳細を処理します。

したがって、これらのフレームワークのいずれかを使用する場合は、優先する JSON ツールを使用するように構成し、ルールを定義するだけで済みます。

于 2013-10-14T05:51:51.893 に答える
0

以下のようにこれを実現できます。

サーバ側:

@PUT
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addRecord(CustomClass mCustomClass)
{
    ///
    ///
    ///
    return "Added successfully : "+CustomClass.getName();

}// addRecord

クライアント側:

public static void main(String[] args)
{
    ///
    ///
    ///
    CustomClass mCustomClass = new CustomClass();
    Client client = ClientBuilder.newClient();
    String strResult = client.target(REST_SERVICE_URL).request(MediaType.APPLICATION_XML).put(Entity.xml(mCustomClass), String.class);
}
于 2016-03-17T09:34:19.940 に答える