หน้าเว็บ

วันอังคารที่ 9 กรกฎาคม พ.ศ. 2556

JSF ManagedBean can @Autowire Spring resources : java, JSF

        ปกติเวลาเราจะใช้  managed bean เราจะต้อง @ManagedBean บน class นั้นๆ  เสมอ
เมื่อ 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.java
package 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);
        }
    }
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น