Primefaces 上传过滤器干扰 Servlet 上传
Primefaces Upload Filter interferes Servlet Upload
我遇到以下问题:
在我的 Spring 带有 Primefaces UI 的引导网络应用程序中,我想在后端上传资产。我还想通过 webservlet 为上传资产提供一个 web 服务。
似乎是 Primefaces 上传过滤器干扰了网络服务。
我的 ServletContextInitializer class:
@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 class 看起来像这样:
@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 不起作用(fileparts 为空)。 Primefaces UI 的上传处理程序工作正常。
当我取消注释 Primefaces 上传过滤器时,webservlet 工作正常并且文件部分被填充。但是根本不会调用 Primefaces UI 上传处理程序。
这里有什么问题?我必须重新配置上传过滤器吗?
感谢您的帮助。
实际上您的过滤器 'listening' 太宽泛了。 FilterRegistrationBean 可以选择设置 servlet 名称。
Registrations can be associated with URL patterns and/or servlets (either by name or via a ServletRegistrationBeans. When no URL pattern or servlets are specified the filter will be associated to '/*'. The filter name will be deduced if not specified.
试试这个而不是 url 模式,就像在 this answer
中所做的那样
<servlet-name>facesServlet</servlet>
我遇到以下问题: 在我的 Spring 带有 Primefaces UI 的引导网络应用程序中,我想在后端上传资产。我还想通过 webservlet 为上传资产提供一个 web 服务。
似乎是 Primefaces 上传过滤器干扰了网络服务。
我的 ServletContextInitializer class:
@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 class 看起来像这样:
@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 不起作用(fileparts 为空)。 Primefaces UI 的上传处理程序工作正常。 当我取消注释 Primefaces 上传过滤器时,webservlet 工作正常并且文件部分被填充。但是根本不会调用 Primefaces UI 上传处理程序。
这里有什么问题?我必须重新配置上传过滤器吗?
感谢您的帮助。
实际上您的过滤器 'listening' 太宽泛了。 FilterRegistrationBean 可以选择设置 servlet 名称。
Registrations can be associated with URL patterns and/or servlets (either by name or via a ServletRegistrationBeans. When no URL pattern or servlets are specified the filter will be associated to '/*'. The filter name will be deduced if not specified.
试试这个而不是 url 模式,就像在 this answer
中所做的那样<servlet-name>facesServlet</servlet>