p: метод fileUpload не вызывается в Spring Bean - PullRequest
0 голосов
/ 04 января 2019

Этот вопрос касается загрузки и обработки данных CSV в Spring Framework с использованием загрузки Primefaces для создания новых записей в базе данных.

Я построил свой XHTML-код на шаблоне из Primefaces. Когда я нажимаю кнопку «Отправить», должен быть вызван метод 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())); 

}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Хорошо, так что в конце концов моя проблема решила добавить эти методы в мои конфигурации сервлетов, и теперь загрузка работает просто отлично:

@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");
    }
};
}
0 голосов
/ 04 января 2019

Две общие вещи, которые люди забывают из руководства пользователя.Не забудьте, что «сервлет лиц» должен совпадать с именем вашего сервлета вашего сервлета Faces в web.xml

  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>
    
...