2017-09-13 32 views
6

Çevre:Bahar Boot MTU Entegrasyon

Tomcat 8

Bahar Boot 1.5

MTU 2.2

Apaçi MyFaces

Bahar MVC

Kodu:

Spring Boot ve JSF 2.2'yi Servlet 3.0 ortamında bütünleştiriyorum.

Yapılandırma Sınıflar:

JSFConfig.java - JSF için Yapılandırma.

@Configuration 
@ComponentScan({"com.atul.jsf"}) 
public class JSFConfig { 

     @Bean 
     public ServletRegistrationBean servletRegistrationBean() { 
      FacesServlet servlet = new FacesServlet(); 
      return new ServletRegistrationBean(servlet, "*.jsf"); 
     } 

} 

Bahar Boot Ana Sınıfı:

@SpringBootApplication 
@Import({ // @formatter:off 
    JPAConfig.class, 
    ServiceConfig.class, // this contains UserServiceImpl.java class. 
    WebConfig.class, 
    JSFConfig.class, 
}) 
public class SpringbootJpaApplication extends SpringBootServletInitializer{ 

    public static void main(String[] args) { 
     SpringApplication.run(SpringbootJpaApplication.class, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
      return application.sources(SpringbootJpaApplication.class); 
    } 
} 

Yönetilen Fasulye:

UserBean.java - JSF için Bean Yönetilen

@ManagedBean 
@SessionScoped 
public class UserBean implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private String name; 
    @ManagedProperty(value="#{userServiceImpl}") 
    private UserServiceImpl userServiceImpl; 

    public void addUser(){  
     System.out.println("User Gets added "+this.name);  
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
    public UserServiceImpl getUserServiceImpl() { 
     return userServiceImpl; 
    } 

    public void setUserServiceImpl(UserServiceImpl userServiceImpl) { 
     this.userServiceImpl = userServiceImpl; 
    } 
} 

Facelets:

home.xhtml - ana sayfa

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html"> 

    <h:head> 
     <title>JSF 2.0 Hello World</title> 
    </h:head> 
    <h:body> 
     <h2>JSF 2.0 Hello World Example - hello.xhtml</h2> 
     <h:form> 
      <h:inputText value="#{userBean.name}"></h:inputText> 
      <h:commandButton value="Submit" action="#{userBean.addUser}"></h:commandButton> 
     </h:form> 
    </h:body> 
</html> 

yüzler-config.xml

<?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/web-facesconfig_2_2.xsd" 
       version="2.2"> 

    <application> 
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application> 
    <lifecycle> 
     <phase-listener>org.springframework.web.jsf.DelegatingPhaseListenerMulticaster</phase-listener> 
    </lifecycle> 

</faces-config> 

Sayı

: Ben home.xhtml , userBean.addUser formu gönderdiğinde

1) çağrılır. 2) userBean.name, kullanıcı tarafından girilen değerlerle ayarlanır. 3) Ancak userServiceImpl NULL'dir. 4) Bu, Spring ve JSF'nin entegre edilmediği anlamına mı geliyor? Ben de

faces-config.xml 

Ben de UserBean.java tüm JSF özgü açıklamaları çıkarmadan çalıştı belirtilen ve aşağıda gibi belirli ek açıklamaları Bahar sadece kullanıldığı gibi SpringBeanFacesELResolver kayıt yaptıran -

@Component 
    @SessionScoped 
    public class UserBean implements Serializable{ 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     private String name; 
     @Autowired 
     private UserServiceImpl userServiceImpl; 


    } 

Ama formu göndermek, ben hedef alıyorum #{userBean) için erişilemiyor. Bu userBean İlkbahar

için keşfedilemez anlamına gelir. 5) Burada bir şey eksik miyim?

1. Servlet kaydı

MTU Servlet'dir Kayıt ve yapılandırmak: Ben Bahar Boot

cevap

4

ile sağlanan gömülü tomcat kullanarak değilim 6) Bu benim JSF Bahar Boot ile çalışan çıkma yöntemi başlangıçta yüklemek için (web.xml gerek yok). JSF 2 ile çalışıyorsanız.2, en iyi, en azından facelets kullanırken, *.xhtml eşleme kullanmaktır:

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

Eğer init parametrelerini ayarlayabilirsiniz böylece yapılandırma sınıfı ServletContextAware uygulamak olun. Burada yapılandırmayı yüklemek için JSF zorlamak gerekir:

@Override 
public void setServletContext(ServletContext servletContext) { 
    servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", 
      Boolean.TRUE.toString()); 
    servletContext.setInitParameter("javax.faces.FACELETS_SKIP_COMMENTS", "true"); 
    //More parameters... 
} 

2. EL entegrasyonu

yüzler-config.xml EL resolver bildirin.

<?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/web-facesconfig_2_2.xsd" 
    version="2.2"> 

    <application> 
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver 
     </el-resolver> 
    </application> 

</faces-config> 

3. Görünüm Kapsam

MTU görünümü kapsamını taklit için özel Bahar kapsamını yaz (bulundurun: Bu görüş dosya ve yönetilen fasulye özellikleri ve yöntemleri arasındaki tutkal olacak fasulyelerin, Spring tarafından yönetilmeyeceğini düşünün, JSF değil).

public class ViewScope implements Scope { 

    @Override 
    public Object get(String name, ObjectFactory<?> objectFactory) { 
     Map<String, Object> viewMap = FacesContext.getCurrentInstance() 
      .getViewRoot().getViewMap(); 
     if (viewMap.containsKey(name)) { 
      return viewMap.get(name); 
     } else { 
      Object object = objectFactory.getObject(); 
      viewMap.put(name, object); 
      return object; 
     } 
    } 

    @Override 
    public String getConversationId() { 
     return null; 
    } 

    @Override 
    public void registerDestructionCallback(String name, Runnable callback) { 

    } 

    @Override 
    public Object remove(String name) { 
     return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name); 
    } 

    @Override 
    public Object resolveContextualObject(String arg0) { 
     return null; 
    } 

} 

Ve yapılandırma sınıfında kaydetmek: Bu gibi bazı biçimde görünmelidir

@Bean 
public static CustomScopeConfigurer viewScope() { 
    CustomScopeConfigurer configurer = new CustomScopeConfigurer(); 
    configurer.setScopes(
      new ImmutableMap.Builder<String, Object>().put("view", new ViewScope()).build()); 
    return configurer; 
} 

4. gitmeye hazır!

Şimdi yönetilen fasulyelerinizi aşağıdaki gibi bildirebilirsiniz. @ManagedProperty yerine @Autowired'u (tercihen kurucularda) kullanmayı unutmayın, çünkü Spring Bean'lerle uğraşıyorsunuz.


@Component @Scope("view") public class MyBean { //Ready to go! } 

Hala

ben JSF özgü ek açıklamalar Bahar Boot bağlamında işe alamadım ulaşmak için beklemede. Yani @FacesValidator, @FacesConverter, @FacesComponent, vb. Kullanılamaz. Yine de, onları yüz-config.xml'de (xsd'a bakın) eski moda şekilde ilan etme şansı var.


Ayrıca bakınız:

+0

Xtreme Biker Eğer JSF ek açıklamalar işe gitmek için bir yol bulmak mı? belki ilkbahar 2.0 ile mi? –

+0

Hayır, ama bu cevabı yazdığımdan beri çok fazla kazmadım. Burada fasulyelerinizi yöneten Spring olduğu için, @Component olarak tekil sayılar üreten bir ek açıklama deneyebilirsiniz. –

İlgili konular