เมื่อ JSF engine ทำ reflection แล้วมาเจอ @ManagedBean มันก็จะเอา class ที่เราเขียน มาทำเป็น managed bean ให้เราโดยอัตโนมัติ ซึ่งก็ขึ้นอยู่กับ scope ของ managed bean ตัวนั้นๆ ว่าจะถูกเรียกใช้งาน หรือ new instance ขึ้นมาเมื่อไหร่
แต่ว่าการใช้งานแบบนี้ การสร้าง managed bean ผ่าน jsf engine นั้น โดยปกติแล้ว เราไม่สามารถ @Autowire หรือ inject resources ของ spring เข้ามาได้เลย เพราะ class นั้น spring ไม่ได้เป็นคนสร้างให้เรา เราจึงไม่สามารถ @Autowire ได้
แล้วมีวิธีมั้ยที่จะทำให้ managed bean นั้นสามารถ @Autowire ได้
คำตอบคือมีครับ
โดยเราจะให้ spring เป็นคนสร้าง managed bean ให้เราแทน concept มีแค่นี้ มาดู code กันครับ
ที่ faces-config.xml
<?xml version='1.0' encoding='UTF-8'?> <!-- =========== FULL CONFIGURATION FILE ================================== --> <faces-config version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"> <application> <el-resolver> org.springframework.web.jsf.el.SpringBeanFacesELResolver </el-resolver> </application> </faces-config>โดยปกติแล้ว ตรงส่วนของ view (.xhtml) jsf engine จะเป็นตัวจัดการเรื่องของ EL(expression language) resolver #{managedbean.property} ให้เรา ทำให้เราไม่สามารถใช้ component ของ spring ตรง view ได้ วิธีการคือ ให้เราเปลี่ยน view resolver เพื่อให้ spring ทำหน้าที่แทนซ่ะ นั่นก็แสดงว่าเราสามารถใช้งาน resources ของ spring ได้แล้ว เมื่อใช้งาน resources ของ spring ได้ ก็แสดงว่า @Autowire ได้นั่นเองครับ ประมาณนี้
FirstManagedBean.javapackage com.blogspot.na5cent.modeshapelearning.managedbean; import java.io.Serializable; import javax.annotation.PostConstruct; import javax.faces.bean.SessionScoped; import javax.jcr.LoginException; import javax.jcr.Repository; import javax.jcr.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * * @author redcrow */ @Component//***** @SessionScoped public class FirstManagedBean implements Serializable { private static final Logger LOG = LoggerFactory.getLogger(FirstManagedBean.class); @Autowired//***** private Repository repository; @PostConstruct public void postConstruct() { LOG.debug("repository => {}", repository); } public void start() { try { repository.login(); } catch (LoginException ex) { LOG.warn(null, ex); } catch (RepositoryException ex) { LOG.warn(null, ex); } } }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น