这是我的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)。春天是不是能够阅读请求并发送适当的回复,或者我在这里遗漏了什么?有没有办法让它发挥作用?
注意:类FilePacket
为Serializable
,其中一个字段的类型为byte[]
,其中包含文件数据。
答案 0 :(得分:0)
Spring使用HttpMessageConverter
实例的集合将请求主体反序列化为将传递给处理程序方法的参数。
Spring没有将HttpMessageConverter
转换为您的自定义application/octet-stream
类的FilePacket
。您可以改为使用byte[]
并自行进行转换(或者提供自己的HttpMessageConverter
来执行转换。)
Spring对@ResponseBody
使用相同的策略,使用这些相同的HttpMessageConverter
实例来序列化返回给响应主体的对象。它没有内置使用Java Serialization的东西。请注意,对于大多数(如果不是全部)这些响应类型,您的客户端需要提供显式Accept:
标头以指定它接受的内容。