java:Spring @RequestBody和@ResponseBody不能使用java.net

时间:2015-02-27 15:26:11

标签: java spring sockets spring-mvc

这是我的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)。春天是不是能够阅读请求并发送适当的回复,或者我在这里遗漏了什么?有没有办法让它发挥作用?

注意:类FilePacketSerializable,其中一个字段的类型为byte[],其中包含文件数据。

1 个答案:

答案 0 :(得分:0)

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

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

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