【问题标题】:p:fileUpload method is not called in spring beanp:fileUpload 方法未在 spring bean 中调用
【发布时间】:2019-01-04 11:43:18
【问题描述】:

这个问题涉及在 Spring Framework 中上传和处理 CSV 数据,使用 Primefaces 上传,以便在数据库中创建新条目。

我已经在 Primefaces 的模板上构建了我的 XHTML 代码。当我单击提交按钮时,应该调用 uploadDevices 方法,但我发现该方法从未输入过。当我删除 ajax="false" 语句时,该方法被调用,但在 Inputstream 处抛出 Nullpointer 异常,因此显然没有收到文件。

有人对如何做有建议吗? ajax 语句做了什么,阻止了方法被调用?

非常感谢任何帮助。

devices.xhtml

<h:form enctype="multipart/form-data" style="margin-bottom:20px">
    <p:growl id="messages" showDetail="true" />

    <p:fileUpload value="#{fileUploadView.file}" ajax="false" mode="simple" skinSimple="true" allowTypes="/(\.|\/)(csv)$/"/>

    <p:commandButton value="Submit" ajax="false" action="#{fileUploadView.uploadDevices()}" disabled="false" />
</h:form>

FileUploadView.java

@Component
@Scope("view")
public class FileUploadView {

private UploadedFile file;
// plus getter and setter

@Autowired
private DeviceService deviceService;

private Device device;

public void uploadDevices() { 
    final CSVParser parser = new CSVParserBuilder().withSeparator(',').withIgnoreQuotations(true).build();
    final BufferedReader fileReader = new BufferedReader(new InputStreamReader(file.getInputstream())); 

}

【问题讨论】:

  • 如果将其设为 jsf 或 cdi 托管 bean 是否有效?并删除 which ajax=false?
  • 我试图将其设为 [at]ManagedBean [at]ViewScoped,但这并没有做任何事情。当我删除 p:commandButton 中的 ajax="false" 时,它会进入 bean 方法,但会在首先提到文件的地方抛出 Nullpointer 异常,所以我想是没有文件
  • @ManagedBean 不是 CDI 托管 bean,即@Named(有相应的作用域,注意那些),这种情况下需要 commandButton 上的ajax="false",即上传就可以去掉了。而如果你在jsf开发模式下运行,有什么错误吗?

标签: ajax spring jsf primefaces


【解决方案1】:

人们从用户指南中忘记了两件常见的事情。不要忘记“Faces Servlet”必须与 web.xml 中 Faces Servlet 的 Servlet 名称匹配

  1. 在您的 web.xml 中

    <!-- Primefaces required for FileUploads to work -->
    <filter>
       <filter-name>PrimeFaces FileUpload Filter</filter-name>
       <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
       <filter-name>PrimeFaces FileUpload Filter</filter-name>
       <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    
  2. 在你的 pom.xml 中添加 Commons Upload 依赖。

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
    

【讨论】:

  • 我曾经为橱窗写了一个“补丁”,让这些东西在那里可见。不知道它在哪里结束,可能是我从来没有提交过。或者至少参考文档会有很大帮助
  • 感谢您的回复。但这并没有解决我的问题。
【解决方案2】:

好的,所以最终解决我的问题是在我的 Servlet 配置中添加这些方法,现在上传工作正常:

@Bean
public ServletRegistrationBean facesServletRegistratiton() {
ServletRegistrationBean registration = new ServletRegistrationBean(new FacesServlet(), new String[] { "*.xhtml" });
registration.setName("Faces Servlet");
registration.setLoadOnStartup(1);
return registration;
}

@Bean
public FilterRegistrationBean facesUploadFilterRegistration() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new FileUploadFilter(), facesServletRegistratiton());
registrationBean.setName("PrimeFaces FileUpload Filter");
registrationBean.addUrlPatterns("/*");
registrationBean.setDispatcherTypes(DispatcherType.FORWARD, DispatcherType.REQUEST);
return registrationBean;
}

@Bean
public ServletContextInitializer servletContextInitializer() {
return new ServletContextInitializer() {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.setInitParameter("primefaces.UPLOADER", "commons");
    }
};
}

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2014-06-26
    • 2012-02-05
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多