2017-09-13 13 views
6

पर्यावरण:स्प्रिंग बूट JSF एकता

बिलाव 8

स्प्रिंग बूट 1,5

JSF 2,2

अपाचे MyFaces

वसंत MVC

कोड:

+०१२३५१६४१०६१

मैं सर्वलेट 3.0 पर्यावरण में स्प्रिंग बूट और जेएसएफ 2.2 को एकीकृत कर रहा हूं।

कॉन्फ़िग क्लास:

JSFConfig.java - JSF के लिए कॉन्फ़िग।

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

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

} 

स्प्रिंग बूट मुख्य वर्ग:

@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); 
    } 
} 

प्रबंधित बीन:

UserBean.java - JSF के लिए प्रबंधित बीन

@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 - होम पेज

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

चेहरे-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> 

मुद्दा:

1) कहा जाता हो जाता है जब मैं home.xhtml , userBean.addUser में फ़ॉर्म सबमिट करें। 2) userBean.name उपयोगकर्ता द्वारा दर्ज किए गए मानों के साथ सेट हो जाता है। 3) लेकिन userServiceImpl शून्य है। 4) क्या इसका मतलब है कि वसंत और जेएसएफ एकीकृत नहीं हो रहा है? मैं भी रूप में

faces-config.xml 

मैं भी UserBean.java से सभी JSF विशिष्ट एनोटेशन को दूर करने की कोशिश की में उल्लेख किया है और केवल इस्तेमाल किया नीचे जैसे विशिष्ट एनोटेशन स्प्रिंग पंजीकृत किया है SpringBeanFacesELResolver -

@Component 
    @SessionScoped 
    public class UserBean implements Serializable{ 

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


    } 

लेकिन जब मैं फ़ॉर्म सबमिट करेंगे, मैं #{userBean) के लिए लक्ष्य पहुंचने योग्य त्रुटि प्राप्त कर रहा हूं। इसका मतलब है userBean वसंत

5) क्या मुझे यहां कुछ याद आ रही है?

1. सर्वलेट पंजीकरण

JSF सर्वलेट रजिस्टर और यह कॉन्फ़िगर करें: 6) मैं वसंत बूट

उत्तर

4

के साथ प्रदान की एम्बेडेड बिल्ला उपयोग नहीं कर रहा इस तरह से मैं JSF स्प्रिंग बूट के साथ काम किया है स्टार्टअप पर लोड करने के लिए (web.xml की कोई ज़रूरत नहीं है)। अगर जेएसएफ 2 के साथ काम कर रहे हैं।2, अपने सबसे अच्छे *.xhtml मानचित्रण का उपयोग करने, कम से कम facelets का उपयोग करते समय है:

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

आपके विन्यास वर्ग को लागू ServletContextAware ताकि आप अपने init पैरामीटर सेट कर सकते हैं। यहाँ आप विन्यास लोड करने के लिए JSF मजबूर करना होगा:

@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. ईएल एकीकरण

चेहरे-config.xml में EL resolver घोषित।

<?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. स्कोप देखें

JSF दृश्य गुंजाइश अनुकरण करने के लिए एक कस्टम वसंत गुंजाइश लिखें (रखें: इससे आपका दृश्य फ़ाइलें और अपने प्रबंधित सेम गुण और तरीकों के बीच गोंद होने जा रहा है ध्यान रखें कि आपके सेम वसंत द्वारा प्रबंधित किए जा रहे हैं, जेएसएफ नहीं)। यह इस तरह से किसी तरह दिखना चाहिए:

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; 
    } 

} 

और आपके विन्यास कक्षा में इसे पंजीकृत:

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

4. जाने के लिए तैयार!

अब आप अपने प्रबंधित बीन्स को नीचे दिए गए तरीके से घोषित कर सकते हैं। @ManagedProperty के बजाय @Autowired (अधिमानतः रचनाकारों में) का उपयोग करना याद रखें, क्योंकि आप स्प्रिंग बीन्स से निपट रहे हैं।

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

    //Ready to go! 

} 

फिर भी

मैं JSF विशिष्ट एनोटेशन स्प्रिंग बूट संदर्भ में काम नहीं मिल सकता है प्राप्त करने के लिए लंबित है। तो @FacesValidator, @FacesConverter, @FacesComponent, और इसी तरह उपयोग नहीं किया जा सकता है। फिर भी, चेहरे-config.xml में उन्हें घोषित करने का मौका है (xsd देखें), पुराने तरीके से।


यह भी देखें:

+0

Xtreme बाइकर आप JSF एनोटेशन काम करने के लिए प्राप्त करने के लिए एक तरह से पता चला? शायद स्प्रिंग बूट 2.0 के साथ? –

+0

नहीं, लेकिन मैंने इस जवाब को लिखने के बाद बहुत अधिक खोद दिया है। चूंकि यह वसंत है कि आप अपने सेम का प्रबंधन कर रहे हैं, आप कुछ एनोटेशन जेनरेटिंग सिंगलेट्स को @ कॉम्पोनेंट के रूप में देख सकते हैं। –