Jersey 2客户端如何将输入/输出二进制流发送到服务器和反之亦然

时间:2014-05-16 17:20:02

标签: java java-ee jersey jax-rs

我是泽西岛的新手。我有两件事要知道。 1.将域对象从客户端发送到服务器 2.从服务器向客户端发送域对象。

  1. 我想将自定义对象从客户端发送到服务器应用程序。由于要发送的对象类型可能不同(它可以是域对象,文件或图像),我应该将这些对象转换为流并发送到服务器。还有流,我还需要发送一些参数。 然后我需要在服务器中检索流并处理它。

  2. 一旦域对象转换为流,那么它们也应该发送到客户端。

    我使用Jersey 2.8。 Java 8。汤姆卡特6。以下是我尝试这样做的方法,但它失败了(可能是一种错误的方法)

  3. 这是我的客户:

    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。

2 个答案:

答案 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