복붙노트

[SPRING] JSF 관리 빈에서 Spring 서비스를 사용하는 방법은 무엇입니까?

SPRING

JSF 관리 빈에서 Spring 서비스를 사용하는 방법은 무엇입니까?

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

스프링 서비스는 SpringBeanFacesELResolver를 사용하여 주입된다. faces-config.xml에 구성됩니다.

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

Spring 서비스의 주입은 매우 못 생기지 만 작동 중이다.

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

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

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

해결법

  1. ==============================

    1.나는 org.springframework.web.jsf.el.SpringBeanFacesELResolver에 대해서도 많은 이슈를 경험했다. 주로 객체 범위를 일치시키는 것과 관련이 있습니다 (Spring은 JSF의 뷰 범위 및 대화 범위와 동등하지 않습니다). 어떤 사람들은 직렬화 문제에 대해서도 불평합니다.

    나는 org.springframework.web.jsf.el.SpringBeanFacesELResolver에 대해서도 많은 이슈를 경험했다. 주로 객체 범위를 일치시키는 것과 관련이 있습니다 (Spring은 JSF의 뷰 범위 및 대화 범위와 동등하지 않습니다). 어떤 사람들은 직렬화 문제에 대해서도 불평합니다.

    나는이 기사에서 제안 된 해결책을 성공적으로 적용했다 : http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/.

    필자의 경우 직렬화는 문제가 아니었고 빈 범위에만 관심이있었습니다. 스프링 빈 수명주기를 방해하지 않고 JSF가 백킹 빈 라이프 사이클을 완벽하게 관리하기를 바랬다.

    Spring 컨텍스트를로드하고 JSF 컨텍스트에서 Spring 관리 Bean에 액세스하기 위해 autowire하도록 JSF 관리 빈을 만들었습니다.

    나는 다음 JSF bean 수퍼 클래스를 개발했다.

    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 백킹 빈은 다음과 같이 보였다 (문제없이 뷰 범위를 사용할 수 있었다).

    @ManagedBean
    @ViewScoped
    public class MyBackingBean extends AutowireableManagedBean {
    
        @Autowired
        private MyDao myDao;
    
  2. from https://stackoverflow.com/questions/13497528/how-to-use-spring-services-in-jsf-managed-beans by cc-by-sa and MIT license