spring Sping Boot :返回try - catch块未捕获的文件时,io.FileNotFound异常

u3r8eeie  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(93)

我想从服务器返回一个Zip文件。对于存在的文件,它的工作正常,文件得到返回,一切正常。我的问题是不存在的文件。这里我想返回一个404-Error,但目前返回的是500,因为“java.io.FileNotFoundException:无法在文件系统中解析URL [...],以检查其内容长度“在控制器中无法执行。
下面是我的控制器代码:

@GetMapping("analysis/daily/{year}/{month}/{day}/{mode}")
public ResponseEntity<Resource> getDailyAnalysis(
@PathVariable("year") int year, 
@PathVariable("month") int month,
@PathVariable("day") int day, 
@PathVariable("mode") AnalysisSelection type) {
    try {
        Resource resource;
        Path fileBasePath = Path.of("Analysis", "ZIP", "Daily",
                String.valueOf(year),
                String.valueOf(month),
                String.valueOf(day));
        switch (type) {
            case ByItem -> {
                fileBasePath = fileBasePath.resolve("SingleItemAnalysis.zip");
            }
            case ByAuthor -> {
                fileBasePath = fileBasePath.resolve("Author.zip");
            }
            case ByType -> {
                fileBasePath = fileBasePath.resolve("Type.zip");
            }
            case ByIndustry -> {
                fileBasePath = fileBasePath.resolve("Industry.zip");
            }
            default -> {
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
            }
        }
        resource = new UrlResource(fileBasePath.toUri());
        return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/zip"))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    } catch (Exception e) {
        //e.printStackTrace();
        throw new ResponseStatusException(HttpStatus.NOT_FOUND);
    }

}

字符串
奇怪的是,堆栈跟踪指向Spring Security JWT-Token实现:特别是这一行:“filterChain.doFilter(请求,响应);“

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String jwt = getJwtFromRequest(request);

    if (StringUtils.hasText(jwt) && jwtTokenProvider.validateToken(jwt)) {
        String mail = jwtTokenProvider.getUserMailFromToken(jwt);
        UserDetails userDetails = appUserDetailedService.loadUserByUsername(mail);
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());

        authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    filterChain.doFilter(request, response);
}


以下是整个Stack Trace:

java.io.FileNotFoundException: URL [file:/C:/Users/walter/Documents/digitales2go/backend/Analysis/ZIP/Daily/2023/7/18/Author.zip] cannot be resolved in the file system for checking its content length

        at org.springframework.core.io.AbstractFileResolvingResource.contentLength(AbstractFileResolvingResource.java:240)                                                                             

        at org.springframework.http.converter.ResourceHttpMessageConverter.getContentLength(ResourceHttpMessageConverter.java:121)

        at org.springframework.http.converter.ResourceHttpMessageConverter.getContentLength(ResourceHttpMessageConverter.java:45)

        at org.springframework.http.converter.AbstractHttpMessageConverter.addDefaultHeaders(AbstractHttpMessageConverter.java:260)

        at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:211)

        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:293)

        at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219)

        at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)

        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:135)

        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)

        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)

        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)

        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)

        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)

        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)

        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)

        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)

        at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)

        at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)

        at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)

        at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

       at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at de.myProject.security.jwt.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:40)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)

        at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)

        at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)

        at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)

        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)

        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)

        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)

        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)

        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)

        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)

        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)

        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)

        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)

        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)

        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)

        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)

        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)

        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)

        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)

        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)

        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)

        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

        at java.base/java.lang.Thread.run(Thread.java:833)


关于如何确保返回正确的HTTP错误有什么想法?
详细信息请参见上面的代码

xv8emn3q

xv8emn3q1#

尝试添加

...        
    default -> {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
        }
    }
    if (!Files.exists(path)) {
      throw new FileNotFoundException()
    }
    resource = new UrlResource(fileBasePath.toUri());
 ...

字符串

相关问题