Spring MVC,在普通请求中强制JSON响应

时间:2011-10-11 13:05:24

标签: json forms spring

我正在使用Spring 3.0.6,我有一个控制器用于将文件上传到服务器。我正在使用脚本使用XmlHttpRequest上传支持它的浏览器,而其他浏览器提交(隐藏)多部分表单。但问题是,当提交表单时,它会发送以下标题:

Accept  text/html, application/xhtml+xml, */*

我认为由于此标头,标有@ResponseBody的Controller回复响应已转换为XML而不是JSON。有没有办法在不破解表单提交请求的情况下解决这个问题?

4 个答案:

答案 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。