java:Spring@RequestBody和@ResponseBody不适用于java.net



这是我的java.net客户端代码

    URL server = new URL(serverUrl);
    URLConnection connection = server.openConnection();
    /* DoOutput flag is set to true to inform URL connection that we are
     * sending data out. The default behavior is false. This will change
     * the request from GET to a POST.
     */
    connection.setDoOutput (true);
    /* Setting the UseCaches to false allows the application "tunnel
     * through" and ignore the caches.
     */
    connection.setUseCaches (false);
    connection.setRequestProperty ( "Content-Type", "application/octet-stream" );
    ObjectOutputStream sendData = new ObjectOutputStream(connection.getOutputStream());
    sendData.writeObject(packet);
    sendData.flush();
    sendData.close();
    ObjectInputStream recieveData = new ObjectInputStream(connection.getInputStream());
    response =  (Serializable) recieveData.readObject();
    System.out.println(response);
    recieveData.close();

这是我的服务器代码与spring一起接收请求并发回响应

@ResponseBody
@RequestMapping(value="/upload", method=RequestMethod.POST)
public Serializable fileUploadHandler(@RequestBody FilePacket packet, HttpServletRequest request, HttpSession session, HttpServletResponse response){
    // handle request
    return "response";      
}

在运行具有上述配置的代码时,在向服务器发送请求时,我得到Http错误415

java.io.IOException: Server returned HTTP response code: 415 for URL:

我删除了@RequestBody并将其替换为

FilePacket packet = (FilePacket) new ObjectInputStream(request.getInputStream()).readObject();

请求部分很好。但在一次请求后,我得到了406

java.io.IOException: Server returned HTTP response code: 415 for URL:

所以我用代替了@ResponseBody

new ObjectOutputStream(response.getOutputStream()).writeObject("response");

然后一切都很好。

我已经在ajax中使用了这些注释,它们的工作方式很有魅力,但在java.net中,我得到了不受支持的媒体类型(415)和不可接受的(406)。spring是否无法阅读请求并发送正确的响应,或者我在这里遗漏了什么?有办法让它发挥作用吗?

注意:类FilePacketSerializable,其中一个字段的类型为byte[],用于保存文件数据。

Spring使用HttpMessageConverter实例的集合将请求体反序列化为将传递给处理程序方法的参数。

Spring没有这样一个HttpMessageConverter,它将application/octet-stream转换为您的自定义FilePacket类。您可以使用byte[]自己进行转换(或者提供自己的HttpMessageConverter来进行转换)。

Spring对@ResponseBody使用相同的策略,使用这些相同的HttpMessageConverter实例序列化返回到响应主体的对象。它没有使用Java序列化的内置功能。请注意,对于这些响应类型中的大多数(如果不是全部的话),您的客户端需要提供一个明确的Accept:标头来指定它接受的内容。

最新更新