Jim Green
Jim Green

Reputation: 1118

Can not catch the exception( Multipart Mime part file exceeds max filesize)

My springboot version is 2.0.2, And I create the global Exception in the controller class, likes :

@ExceptionHandler(Exception.class)
@ResponseBody
public Result handleException(Exception e, HttpSession session, HttpServletRequest request) {
    LOGGER.error(e.getMessage());

But I could not catch the exception, it seems I should catch the exception before controller, How?

org.eclipse.jetty.http.BadMessageException: 400: Unable to parse form content at org.eclipse.jetty.server.Request.getParameters(Request.java:390) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.Request.getParameter(Request.java:1025) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:75) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) ~[jetty-servlet-9.4.10.v20180503.jar:9.4.10.v20180503] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) ~[jetty-servlet-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) ~[jetty-servlet-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) ~[jetty-security-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) ~[jetty-servlet-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.Server.handle(Server.java:531) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281) ~[jetty-io-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102) ~[jetty-io-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) ~[jetty-io-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:132) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:760) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:678) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] Caused by: java.lang.IllegalStateException: Multipart Mime part file exceeds max filesize at org.eclipse.jetty.util.MultiPartInputStreamParser$MultiPart.write(MultiPartInputStreamParser.java:174) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:812) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:493) ~[jetty-util-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.MultiParts$MultiPartsUtilParser.(MultiParts.java:121) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.Request.newMultiParts(Request.java:2410) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.Request.getParts(Request.java:2333) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:479) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] at org.eclipse.jetty.server.Request.getParameters(Request.java:386) ~[jetty-server-9.4.10.v20180503.jar:9.4.10.v20180503] ... 35 more

Upvotes: 0

Views: 1086

Answers (1)

user911651
user911651

Reputation:

One solution is to use a ControllerAdvice. Have a look at the following example:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(value = {MaxUploadSizeExceededException.class})
    protected ResponseEntity<String> handle(MaxUploadSizeExceededException ex) {
        return ResponseEntity.ok(ex.getMessage());
    }
}

Alternatively you can let the controller extend from HandlerExceptionResolver, if you have a view oriented controller. Please have a look at the following example:

@Controller
public class MyController implements HandlerExceptionResolver {
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public ModelAndView someMethod(@RequestParam("file") MultipartFile file) throws Exception{
        return new ModelAndView("success");
    }

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        if (e instanceof MaxUploadSizeExceededException){
            return new ModelAndView("sizeLimitExceeded");
        }
        return new ModelAndView("otherException");
    }
}

Upvotes: 1

Related Questions