3

在 Spring MVC 中实现 File Uploader 控制器时,我遇到了一个问题。我的代码快照如下。


@Controller
public class FileUploader extends AbstractBaseController implements HandlerExceptionResolver
{
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ResponseBody
    public JSONObject handleFileUpload(@RequestParam("file") MultipartFile file)
    {
        JSONObject returnObj = new JSONObject();
        if (file.isEmpty())
        {
            returnObj.put("success", "false");
            returnObj.put("message", "File is empty");
        }
        else
        {
            try
            {
                //my file upload logic goes here 
            }
            catch (Exception e)
            {
                returnObj.put("success", "false");
                returnObj.put("message", "File not uploaded.");
            }
        }

        return returnObj;
    }

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, Exception exception)
    {
        ModelAndView model = new ModelAndView();
        Map map = new HashMap();
        if (exception instanceof MaxUploadSizeExceededException)
        {
            // I want to return JSONObject from here like given below.
            /**
             * { "message":"File size exceeded", "success":"false" }
             * */
            map.put("message", "File size exceeded");
            map.put("success", "false");
            model.addObject(map);
        }
        return model;
    }
}


我的弹簧配置看起来像

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
    <property name="maxUploadSize" value="300000"/>
    </bean>

现在在我的控制器中,我想在我的控制器中的 resolveException 方法中返回 JSONObject 而不是 ModelAndView,如代码快照中给出的那样,因为我正在开发一些类似 REST 的方法来上传文件。

有任何想法吗?谢谢

4

2 回答 2

4

如果你使用上面的 Spring 3.2,我推荐这种方式。

  1. 首先,声明ControllerAdvice。

    @Controller
    @ControllerAdvice
    public class JAttachfileApi extends BaseApi
    
  2. 并使异常处理程序响应 JSON 对象,如下所示。

        @ExceptionHandler(MaxUploadSizeExceededException.class)
        public @ResponseBody Map<String,Object> handleMaxUploadSizeExceededException(
     MaxUploadSizeExceededException ex) 
        {
    
            Map<String,Object> result = getResult();
    
            JFileUploadJsonResponse errorResult = new JFileUploadJsonResponse();
            errorResult.setError("Maximum upload size of "+ex.getMaxUploadSize()+" bytes exceeded.");
            List<JFileUploadJsonResponse> resultData = new ArrayList<JFileUploadJsonResponse>();
            resultData.add(errorResult);
            result.put("files", resultData);
    
          return result;
        }
    
于 2014-03-31T01:34:17.137 回答
0

您只需将方法 resolveException 注释为 @ExceptionHandler() ,然后您就可以像任何其他控制器方法一样拥有它的签名。因此,将 @ResponseBody 放在返回类型之前应该可以工作。

“很像带有@RequestMapping 注解的标准控制器方法,@ExceptionHandler 方法的方法参数和返回值可以是灵活的。例如,可以在 Servlet 环境中访问 HttpServletRequest,在 Portlet 环境中访问 PortletRequest。返回类型可以是一个字符串,它被解释为一个视图名称、一个 ModelAndView 对象、一个 ResponseEntity,或者您也可以添加 @ResponseBody 以使用消息转换器将方法返回值转换并写入响应流。”

于 2013-12-19T13:11:02.370 回答