Primefaces上传过滤器会干扰Servlet上传

问题描述 投票:0回答:1

我有以下问题:在带有Primefaces UI的Spring Boot Web应用程序中,我想在后端上传资产。我也想通过WebServlet使Web服务可用于uploadig资产。

似乎Primefaces上传过滤器会干扰Web服务。

我的ServletContextInitializer类:

   @Configuration
   public class Initializer implements ServletContextInitializer {
      @Bean
      public FilterRegistrationBean FileUploadFilter() {
         FilterRegistrationBean registration = new FilterRegistrationBean();
         registration.setFilter(new org.primefaces.webapp.filter.FileUploadFilter());
         registration.setName("PrimeFaces FileUpload Filter");
         registration.addUrlPatterns("/*");
         registration.setDispatcherTypes(DispatcherType.FORWARD, DispatcherType.REQUEST);
         registration.setAsyncSupported(true);
         return registration;
      }
   }

我的Servlet类看起来像这样:

@WebServlet(name = "InsertAsset", urlPatterns = {"/InsertAsset"})
@MultipartConfig
public class InsertAsset extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        System.out.println(servletContext.getMajorVersion() + "." + servletContext.getMinorVersion());

        List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList());

        for (Part filePart : fileParts) {
            String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); 
            InputStream fileContent = filePart.getInputStream();

        }
    }
}

当Primefaces上载过滤器处于活动状态时,webservlet不起作用(文件部分为空)。 Primefaces UI的上传处理程序可以正常工作。当我取消对Primefaces上载过滤器的注释时,则webservlet可以正常工作,并且文件部分也已填充。但是,根本不会调用Primefaces UI上传处理程序。

这里是什么问题?我必须重新配置上传过滤器吗?

感谢您的帮助。

spring-boot servlets file-upload primefaces
1个回答
0
投票

有效地,您的过滤器“监听”的范围太广。 FilterRegistrationBean可以选择设置servlet名称。

注册可以与URL模式和/或servlet相关联(通过名称或通过ServletRegistrationBeans进行关联。当未指定URL模式或servlet时,过滤器将与'/ *'相关联。如果未指定,则将推断出过滤器名称。

尝试代替URL模式,就像在this answer中一样>>

<servlet-name>facesServlet</servlet>
© www.soinside.com 2019 - 2024. All rights reserved.