我是泽西岛的新手。我有两件事要知道。 1.将域对象从客户端发送到服务器 2.从服务器向客户端发送域对象。
我想将自定义对象从客户端发送到服务器应用程序。由于要发送的对象类型可能不同(它可以是域对象,文件或图像),我应该将这些对象转换为流并发送到服务器。还有流,我还需要发送一些参数。 然后我需要在服务器中检索流并处理它。
一旦域对象转换为流,那么它们也应该发送到客户端。
我使用Jersey 2.8。 Java 8。汤姆卡特6。以下是我尝试这样做的方法,但它失败了(可能是一种错误的方法)
这是我的客户:
InputStream returnStrem = (InputStream)client.target("http://localhost:8080/TestJerseyProject")
.path("rest/save")
.request(new MediaType[] {MediaType.APPLICATION_OCTET_STREAM_TYPE})
.get(InputStream.class);
try {
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(returnStrem));
Object o= ois.readObject();
System.out.println("Entity : "+o );
}catch(Exception e){
e.printStackTrace();
}finally {
returnStrem.close();
}
服务器端代码:
@Path("/cache")
public class ObjectCacheAction {
@GET
@Consumes("application/octet-stream")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response streamExample(InputStream is) {
try {
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(is));
Object o= ois.readObject();
System.out.println("Entity : "+o );
is.close();
}catch(Exception e){
e.printStackTrace();
}finally {
}
StreamingOutput stream = new StreamingOutput() {
public void write(OutputStream os) throws IOException,
WebApplicationException {
try {
MyObj m=new MyObj();//My Domain Object
m.setName("sdfsdf");
ObjectOutputStream oos1 = new ObjectOutputStream(os);
oos1.writeObject(m);
oos1.flush();
oos1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
};
return Response.ok(stream).build();
}
}
可能是我的做法错了。但是,请告诉我如何通过工作代码示例来完成此操作。我试过互联网,但大多数都是Jersey 1.X。
答案 0 :(得分:2)
InputStream returnStrem = (InputStream)client.target("http://localhost:8080/TestJerseyProject")
.path("rest/save")
.request(new MediaType[] {MediaType.APPLICATION_OCTET_STREAM_TYPE})
.get(InputStream.class);
使用最后一个语句,您实际上要求收集InputStream的实例,实际上,您应该询问您希望接收的对象。从服务器代码看,您应该请求MyObj.class,因此客户端代码实际上更像是
MyObj myObj = client.target("http://localhost:8080/TestJerseyProject")
.path("rest/save")
.request(new MediaType[] {MediaType.APPLICATION_OCTET_STREAM_TYPE})
.get(MyObj.class);
我不熟悉以这种方式使用流,所以你可能不得不调整它......
答案 1 :(得分:2)
This Question及其答案解决了我的问题。在答案中,使用了InputStreams。他们运作良好,但我必须做一些修改才能使它们适用于Jersey 2.8。另外,也可以使用直接byte []代替流。我测试过,效果很好。非常感谢Martin Wilson 和sikrip。