在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方法来上传文件。
任何想法? 感谢
答案 0 :(得分:4)
如果您使用上面的Spring 3.2,我推荐这种方式。
首先,声明ControllerAdvice。
@Controller @ControllerAdvice public class JAttachfileApi extends BaseApi
并使Exception Handler响应JSON Object,如下所示。
@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; }
答案 1 :(得分:1)
您只需将方法resolveException注释为@ExceptionHandler(),然后就可以像任何其他控制器方法一样拥有其签名。因此,在返回类型之前放置@ResponseBody应该有效。
“与使用@RequestMapping注释注释的标准控制器方法非常相似,@ ExceptionHandler方法的方法参数和返回值可以是灵活的。例如,可以在Servlet环境中访问HttpServletRequest,在Portlet环境中访问PortletRequest。 type可以是String,它被解释为视图名称,ModelAndView对象,ResponseEntity,或者您也可以添加@ResponseBody以使用消息转换器转换方法返回值并将其写入响应流。“