我正在使用Spring 3.0.6,我有一个控制器用于将文件上传到服务器。我正在使用脚本使用XmlHttpRequest上传支持它的浏览器,而其他浏览器提交(隐藏)多部分表单。但问题是,当提交表单时,它会发送以下标题:
Accept text/html, application/xhtml+xml, */*
我认为由于此标头,标有@ResponseBody
的Controller回复响应已转换为XML而不是JSON。有没有办法在不破解表单提交请求的情况下解决这个问题?
答案 0 :(得分:8)
您可以使用@RequestMapping(produces = "application/json")
强制使用JSON。我不记得这是否可以在3.0中使用,但肯定可以在3.1和3.2中使用。
正如其他人所说,杰克逊需要走上你的阶级路线。
答案 1 :(得分:2)
谢谢!我遇到了完全相同的问题,你的帖子解决了我的问题。
在UI上我正在使用JQuery和这个文件上传插件: https://github.com/blueimp/jQuery-File-Upload/wiki
这是我完成的方法(减去商业逻辑):
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload( @RequestParam("fileToUpload") CommonsMultipartFile uploadFile, ServletResponse response){
List<UploadStatus> status = new ArrayList<UploadStatus>();
UploadStatus uploadStatus = new UploadStatus();
status.add(uploadStatus);
if(uploadFile == null || StringUtils.isBlank(uploadFile.getOriginalFilename())){
uploadStatus.setMessage(new Message(MessageType.important, "File name must be specified."));
}else{
uploadStatus.setName(uploadFile.getOriginalFilename());
uploadStatus.setSize(uploadFile.getSize());
}
ObjectMapper mapper = new ObjectMapper();
try {
JsonGenerator generator = mapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8);
mapper.writeValue(generator, status);
generator.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 2 :(得分:1)
如果您想要JSON响应,可以通过在类路径上使用Jackson JARs来轻松实现。 Spring将自动神奇地接收它们并将你的@ResponseBody
转换为JSON。
答案 3 :(得分:0)
我通过摆脱@ResponseBody
而不是手动转换(总是使用杰克逊)来实现它,即
Response r = new Response();
ObjectMapper mapper = new ObjectMapper();
JsonGenerator generator = mapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8);
try {
File f = uploadService.getAjaxUploadedFile(request);
r.setData(f.getName());
} catch (Exception e) {
logger.info(e.getMessage());
r = new Response(new ResponseError(e.getMessage(), ""));
}
mapper.writeValue(generator, r);
generator.flush();
有没有人知道另一种方式?我尝试设置ContentNegotiatingViewResolver,但我不想通过将所有hmtl分配给json来破坏任何其他控制器。另外,我尝试仅通过自定义视图解析器为此方法执行此操作,但是当我设置jsonview并使用BeanNameViewResolver
时,尽管响应已正确转换为JSON,但服务器会抛出
HttpRequestMethodNotSupportedException:
异常,不支持Request方法'POST'并将状态设置为404。