如何在REST Web服务中传递自定义对象

时间:2013-10-14 05:41:47

标签: web-services rest jersey jersey-client

我在将自定义对象转移到客户端时遇到问题。如何将自定义对象传输到客户端并将其接收回Web服务?我正在通过块传输文件。我想知道我应该如何写我的客户。我尝试在客户端中将其作为MediaType.APPLICATION_JSON传递但我没有得到任何结果意味着它不会传递回Web服务。下面是我正在研究的一些代码。

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() {
}

(假设制定了设定者和吸气剂)

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

提前感谢。

3 个答案:

答案 0 :(得分: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定义的数据结构。请参阅此处有关如何在Jersey中处理该示例的示例:How do I POST a Pojo with Jersey Client without manually convert to JSON?(其中也使用了JAXB)。

答案 1 :(得分:2)

您的REST端点表示您要使用和生成JSON。因此,REST客户端需要将可以反序列化的JSON发送到FileModel,并且TransferInfomation返回的transferInfo需要序列化为JSON才能返回到客户端。

通常,RESTEasyRestletCamelSpring MVC等Java REST框架提供了一些工具,可让您定义JSON序列化程序/反序列化程序,如Jackson以及来自JSON< - >的映射规则Java和框架为您处理细节。

因此,如果您使用其中一个框架,则只需将它们配置为使用首选JSON工具并定义规则。

答案 2 :(得分: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);
}