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

文件模型类

public class FileModel {

private String fileID;
private DataHandler dataHandler;

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

(假设已经制作了 setter 和 getter)

(不确定网络服务是否正确)。还在学习 REST,我想知道客户端应该如何。

提前致谢。

4

3 回答 3

3

在 Jersey 中“编组”和“解组”“自定义对象”(JSON、XML 等)的一个好方法是使用 JAXB(https://jaxb.java.net/)。

为此,您需要创建一个“jaxb 类”,并使用正确的 getter 和 setter(以及注释),例如:

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 定义的数据结构。请参阅此处有关如何在泽西岛处理该问题的示例:如何在不手动转换为 JSON 的情况下使用泽西岛客户端发布 Pojo?(其中也使用了 JAXB)。

于 2013-10-14T07:59:12.210 回答
2

您的 REST 端点表明您想要使用和生成 JSON。所以REST客户端需要发送可以反序列化成FileModel的JSON,TransferInfomation返回的transferInfo需要序列化成JSON返回给客户端。

通常,Java REST 框架(如RESTEasyRestletCamelSpring MVC )提供了允许您定义 JSON 序列化器/反序列化器(如Jackson)和来自 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 回答