2014-12-18 6 views
4

Я запускаю проект JSF, запускающий его с Spring Boot и использующий всю среду Spring. Конфигурация: Mojarra 2.2.8 + Primefaces 5.1 + Spring Boot 1.1.9. Вот как мой файл pom.xml выглядит следующим образом:Primefaces FileUpload не работает в Spring Boot

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.mycompany</groupId> 
    <artifactId>project</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.1.9.RELEASE</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-api</artifactId> 
      <version>${jsf.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-impl</artifactId> 
      <version>${jsf.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.primefaces</groupId> 
      <artifactId>primefaces</artifactId> 
      <version>5.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.primefaces.themes</groupId> 
      <artifactId>all-themes</artifactId> 
      <version>1.0.10</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>javax.el</groupId> 
      <artifactId>el-api</artifactId> 
      <version>2.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.web</groupId> 
      <artifactId>el-impl</artifactId> 
      <version>2.2</version> 
     </dependency> 
    </dependencies> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <start-class>com.tesicnor.workplace.monitor.Application</start-class> 
     <java.version>1.7</java.version> 
     <tomcat.version>7.0.57</tomcat.version> 
     <jsf.version>2.2.8</jsf.version> 
    </properties> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

Как это указано выше, я настройка проекта для запуска в 7.0.57 (Tomcat Servlet 3.0 совместимый) запуска. Все функции JSF корректно работают, но проблема в том, что я не могу получить компонентные компоненты Primefaces p:fileUpload, ни базовые, ни расширенные версии. Слушатель загрузки файлов не запускается и не возникает ошибок.

Вот код моего бина:

@ManagedBean 
@javax.faces.bean.ViewScoped 
public class Bean { 

    public void handleFileUpload(FileUploadEvent event) { 
     FacesMessage message = new FacesMessage("Succesful", event.getFile() 
       .getFileName() + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     System.out.println("Uploaded!"); 
    } 

} 

И вот как мой файл XHTML выглядит, под шаблон:

<ui:composition template="/WEB-INF/template.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 

    <ui:define name="content"> 
     <h:form> 
      <p:fileUpload fileUploadListener="#{bean.handleFileUpload}" /> 
     </h:form> 
    </ui:define> 
</ui:composition> 

Ничего особенного о коде вообще, она должна быть конфигурация сервера вопрос. Когда я отбрасываю файл и нажимаю на , загрузите, удаляется FacesServlet. Таким образом, запрос выполняется, и никаких ошибок javascript не отображается. Но когда я выполняю отладку в классе InvokeApplicationPhase, где должен быть вызван мой метод, я не вижу никаких событий для обработки. Таким образом, FileUploadEvent не привязан к циклу.

Кроме того, это стек отладки другого проекта, который должным образом выполняет загрузку файла с Tomcat 7 и что JSF версия:

enter image description here

Здесь NativeFileUploadDecoder вызывается. Однако этого не происходит в моем проекте загрузки Spring, и не используется метод ниже FileUpload#visitTree.

Я пробовал другие варианты и узнал, что когда я использую <h:form enctype="multipart/form-data">, ни один из методов действий для компонентов внутри не вызывается, даже когда я размещаю простой h:commandButton.

+0

И фильтр загрузки? Я не уверен в загрузке весны, возможно, в нем есть некоторые фильтры ... У меня была такая же проблема, когда я использовал переписывать URL-адреса, мне пришлось добавить к фильму-фильтрацию 'PrimeFaces FileUpload Filter' a ' FORWARD'. это дикое предположение :) –

+0

Спасибо за ответ @HatemAlimam. Я просматривал документацию, и на самом деле у PF есть две опции загрузки в последней версии, одна из которых основана на спецификации Servlet 3.0, а другая в библиотеке 'apache-commons'. Фильтр требуется только при использовании 'apache-commons'. Наконец, я добился, чтобы он работал таким образом, но не с родной спецификацией. Было бы интересно, однако, знать основную причину всего этого. Я опубликую небольшой демонстрационный проект, чтобы люди могли воспроизвести проблему. –

ответ

4

И наконец, я получил его, используя библиотеку Apache Commons. Точно так же то, что мы могли бы сделать в стандартном web.xml файл, это мой контекст инициализатор:

@Bean 
public ServletContextInitializer initializer() { 
    return new ServletContextInitializer() { 
     @Override 
     public void onStartup(ServletContext servletContext) 
       throws ServletException { 
      servletContext.setInitParameter("primefaces.THEME", "bluesky"); 
      servletContext.setInitParameter(
        "javax.faces.FACELETS_SKIP_COMMENTS", "true"); 
      servletContext.setInitParameter(
        "com.sun.faces.expressionFactory", 
        "com.sun.el.ExpressionFactoryImpl"); 
      servletContext.setInitParameter("primefaces.UPLOADER", 
        "commons"); 
     } 
    }; 
} 

я явно сказать Primefaces, чтобы использовать Общин загрузчиком, как сказано в документации (другой выбор должен используйте родной, который не работает).

Затем, просто добавив эти две зависимости в проект, мы готовы пойти:

<dependency> 
    <groupId>commons-fileupload</groupId> 
    <artifactId>commons-fileupload</artifactId> 
    <version>1.3</version> 
</dependency> 
<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.2</version> 
</dependency> 

Я держу нить открыл для некоторого ответа, основанного на родном режиме .

Смотрите также:

+0

Объединив оба ответа, я работал с PF5.3. Благодаря! Сэкономил мне много времени. – SeC

+1

Сочетание обоих ответов сработало для меня, а также PF 6.1 Spring boot 1.5.8. Большое спасибо, что я потерял несколько дней, когда моя жена искала решение. –

4

Это может быть также необходимо перенести конфигурацию фильтра XML в Java на основе Config:

<filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 

к вашему @Configuration

@Bean 
public FilterRegistrationBean FileUploadFilter() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new org.primefaces.webapp.filter.FileUploadFilter()); 
    registration.setName("PrimeFaces FileUpload Filter"); 
    return registration; 
} 

в сочетании с выше ответ он работает для меня

+0

Работало ли оно на родном пути? Я имею в виду, что 'servletContext.setInitParameter (« primefaces.UPLOADER », « native »);' в вашей конфигурации java. Ожидается, что эта конфигурация будет работать без фильтра FileUpload. –

4

Просто поставить свои два цента, с Spring загрузки 1.4.2.RELEASE, Primefaces 6.0, OCP Soft переписать 2.0.12.Final, JSF 2.1. 29-08 и приложение, развернутое на Tomcat 8, мне также необходимо отключить Spring hiddenHttpMethodFilter.

@Bean 
public FilterRegistrationBean hiddenHttpMethodFilterDisabled(
     @Qualifier("hiddenHttpMethodFilter") HiddenHttpMethodFilter filter) { 
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter); 
    filterRegistrationBean.setEnabled(false); 
    return filterRegistrationBean; 
} 

Я провел с этой проблемой почти два дня, и как последняя вещь, которую я попытался отключить пружинные фильтры один за другим, так что я надеюсь, что это поможет кому-то.

+0

После использования решения @Xtreme Biker загрузка выполнялась с помощью приложения в моей среде IDE (независимо от 'упаковки' в' pom.xml'). Однако, как «война», развернутая в tomcat, это не сработало. Добавление вашего решения тоже сделало это для меня. благодаря – wiseOne

Смежные вопросы