Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jax rs在服务器上进行数据的输出和读取,这是为什么?_Java_Http_Jersey_Streaming_Jax Rs - Fatal编程技术网

Java jax rs在服务器上进行数据的输出和读取,这是为什么?

Java jax rs在服务器上进行数据的输出和读取,这是为什么?,java,http,jersey,streaming,jax-rs,Java,Http,Jersey,Streaming,Jax Rs,关于这个话题我贴了两次问题(在这里,我没有得到满意的答案,感觉我无法很好地表达这个问题。我已经解决了这个问题,但我对它的理解很弱。正是偶然的机会让我找到了这个解决方案。我正在做的是在我的Web服务器生成的一个单独的进程上生成结果。当这些结果生成时,我想使用它。)Jersey将字节流式传输到Web服务器,并最终返回到我的客户端(稍后)。我最难弄清楚如何将我的数据流从我的进程返回到我的web服务器。我猜想为我的实体使用StreamingOutput类型会起作用。在web上没有这样的例子,有人能解释泽

关于这个话题我贴了两次问题(在这里,我没有得到满意的答案,感觉我无法很好地表达这个问题。我已经解决了这个问题,但我对它的理解很弱。正是偶然的机会让我找到了这个解决方案。我正在做的是在我的Web服务器生成的一个单独的进程上生成结果。当这些结果生成时,我想使用它。)Jersey将字节流式传输到Web服务器,并最终返回到我的客户端(稍后)。我最难弄清楚如何将我的数据流从我的进程返回到我的web服务器。我猜想为我的实体使用StreamingOutput类型会起作用。在web上没有这样的例子,有人能解释泽西岛发生了什么。我惊讶地发现,我能够将数据作为InputStr在web服务器上读取出来eam

在服务器上的我的servlet容器中运行

@PUT
@Path("groups/{myUuid:" + Regex.UUID + "}")
public void updateSpectraData(@PathParam("myUuid") UUID myUuid, InputStream inputStream)
{
   float[] floatHolder = new float[512];
   byte[] bytes = ByteStreams.toByteArray(inputStream);
   ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
   byteBuffer.asFloatBuffer().get(floatHolder);
   System.out.println(Arrays.toString(floatHolder));
}
下面的代码在服务器生成的单独进程中运行

private void doPut(byte[] data, Object ctx)
{
   final Client client = ClientBuilder.newClient();
   ObjectMapper objectMapper = new ObjectMapper();
   MyTask myTask = objectMapper.readValue(data, MyTask.class);
   MyConifguration config = getConfig();
   WebTarget createTaskTarget = client.target(myTask.getURI());
   Builder request = createTaskTarget.request(MediaType.APPLICATION_OCTET_STREAM);
   request.put(Entity.entity(createData(config), MediaType.APPLICATION_OCTET_STREAM), InputStream.class);
}
以下是创建数据的函数,返回类型很重要:

private StreamingOutput createData(MyConfiguration config)
{
   return new StreamingOutput()
   {
    ...code...
   }
}

Jersey将根据请求的内容类型,尝试为您提供任何作为输入参数的内容。您也可以使用
byte[]
而不是
InputStream
。如果内容类型是application/octet-stream,并且您的输入参数是可序列化对象,那么Jersey将假定传入数据使用Java序列化,这同样适用于
application/xml
(它将使用JAXB)。如果您想更明确地说明这一点,您可以在servlet方法上添加
@Consumes
@products

没有人能详细说明为什么会这样做?我真的不明白您在问什么。我不明白我的“doPut”最后一行的语法方法。它是有效的,但我基本上通过反复试验发现它是有效的。有人能告诉我为什么这样做吗?
getConfig()
do做什么?它有什么关系吗?如果能看到更多自包含的代码就好了。