我在将自定义对象传输给客户端时遇到问题。如何将自定义对象传输到客户端并将其接收回网络服务?我正在按块传输文件。我想知道我应该如何写我的客户。我尝试在客户端中将其作为
MediaType.APPLICATION_JSON
传递,但没有得到任何结果,这意味着它不会传递回网络服务。下面是我正在处理的一些代码。
网络服务
@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,我想知道客户端应该如何。
在 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而不手动转换为 JSON?(其中还使用了 JAXB)。
您的 REST 端点表明您想要使用和生成 JSON。所以REST客户端需要发送可以反序列化为
FileModel
的JSON,而TransferInfomation
返回的transferInfo
需要序列化为JSON才能返回给客户端。
通常,Java REST 框架(如 RESTEasy、Restlet、Camel 和 Spring MVC)提供了一些工具,可让您定义 JSON 序列化器/反序列化器(如 Jackson)以及来自 JSON <--> Java 的映射规则,以及框架会为您处理细节。
因此,如果您使用这些框架之一,您只需将它们配置为使用首选 JSON 工具并定义规则即可。
您可以像下面这样实现:
服务器端:
@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);
}