2012-11-21 5 views
1

JSF는 Java 세계에서 매우 널리 사용되는 기술이지만 Spring과의 협력은 여전히 ​​고통스럽고 '해로운'해킹이 필요합니다. 나는 현재이 '해킹'중 하나에 문제가 있습니다.JSF 관리 빈에서 Spring 서비스를 사용하는 방법은 무엇입니까?

스프링 서비스는 SpringBeanFacesELResolver을 사용하여 주입됩니다.

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

봄 서비스의 주입은 매우 추한이지만, 노력하고 있습니다 : faces-config.xml에 구성되어

@ManagedProperty(value="#{customerService}") 
CustomerService customerService; 

을하지만 문제가 있습니다. JSF는 관리 Bean을 직렬화 할 수 있어야한다고 요구한다. 즉, Spring 서비스도 직렬화 가능해야하거나 필드가 일시적이어야합니다. 필드가 일시적 일 때 주입이 작동하지 않습니다 (해당 필드에 null이 있음). 그리고 Spring 서비스를 직렬화 가능하게 만드는 것은 좋은 생각이 아니며 잠재적 인 성능 문제가 아닙니다. Hibernate 컨텍스트, 데이터 소스, 모든 것이 Spring 서비스에 주입되는 것은 무엇입니까?

JSF 관리 빈을 사용하여 Spring 서비스를 사용하는 것이 정확하고 덜 고통스러운 방법은 무엇입니까?

답변

1

org.springframework.web.jsf.el.SpringBeanFacesELResolver에서 많은 문제가 발생했습니다. 대부분 객체 스코프 일치와 관련이 있습니다 (Spring은 JSF의 뷰 범위 및 대화 범위와 동일하지 않습니다). 어떤 사람들은 직렬화 문제에 대해서도 불평합니다.

이 기사에서 제안 된 솔루션을 성공적으로 적용했습니다 : http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/.

필자의 경우 직렬화는 문제가 아니며 콩 범위에만 관심이있었습니다. Spring Bean 라이프 사이클을 방해하지 않고 JSF가 Backing Bean 라이프 사이클을 완벽하게 관리하기를 바랬다.

스프링 컨텍스트를로드하기 위해 JSF 관리 빈을 만들고 JSF 컨텍스트에서 Spring 관리 빈에 액세스하기 위해 자체 autowire를 작성했다.

@ManagedBean 
@ViewScoped 
public class MyBackingBean extends AutowireableManagedBean { 

    @Autowired 
    private MyDao myDao; 
:이 (내가 문제없이보기 범위를 사용 할 수 있었다)처럼 내 콘크리트 JSF 뒷면 콩 모습, 그리고

public abstract class AutowireableManagedBean { 

    protected AutowireCapableBeanFactory ctx; 

    @PostConstruct 
    protected void init() { 
     logger.debug("init"); 
     ctx = WebApplicationContextUtils 
       .getWebApplicationContext(
         (ServletContext) FacesContext.getCurrentInstance() 
           .getExternalContext().getContext()) 
       .getAutowireCapableBeanFactory(); 
     // The following line does the magic 
     ctx.autowireBean(this); 
    } 
    ... 
} 

:

나는 다음과 같은 JSF 콩 슈퍼 클래스를 개발
관련 문제