SpringBootでPrimefacesのFileUploadを使う

すげーハマった。
正確にはSpring MVCと一緒に使ったとき。


いまのところこんな感じ

  • SpringApplication.runしたときに@ManagedBeanが効く設定がわからない
  • なのでConverterでDIができない(DIさせるにはConverterはManagedBeanにしてconverterId指定じゃなくbinding指定する必要がある)
  • Converterの登録にはfaces-config.xmlを使う
  • Spring MVCServlet 3.0 File Uploadが使えない。のでCommons FileUploadを使う。
  • onStartUpメソッドが呼ばれてない


onStartupが呼ばれてないというのがクセモノで、Overrideしてるし当然よばれてるだろうと思ってたら呼ばれてなくて、commonsを使うという指定が効いてなくてハマった。


Applicationクラスはこう

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer implements ServletContextAware{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println("never invoked");
    }
    
    @Override
    public void setServletContext(ServletContext servletContext) {
        servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", Boolean.TRUE.toString());
        servletContext.setInitParameter("primefaces.UPLOADER", "commons");
        servletContext.addListener(new RequestContextListener());
    }

    @Bean
    public ServletRegistrationBean facesServletRegistration() {
        FacesServlet servlet = new FacesServlet();
        ServletRegistrationBean registration = new ServletRegistrationBean(servlet, "*.xhtml");
        registration.setLoadOnStartup(1);
        return registration;
    }

    @Bean
    public ServletListenerRegistrationBean<ConfigureListener> jsfConfigureListener() {
        return new ServletListenerRegistrationBean<>(new ConfigureListener());
    }
    @Bean
    public FilterRegistrationBean filterBean(){
        FilterRegistrationBean frb = new FilterRegistrationBean();
        frb.setFilter(new FileUploadFilter());
        frb.addServletRegistrationBeans(facesServletRegistration());
        return frb;
    }
}


あと、faces-config.xmlをresources/META-INFに

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                                  http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" 
              version="2.2">
  <application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
  </application>
 
</faces-config>