Как использовать службы Spring в bean-компонентах, управляемых JSF?

JSF - очень популярная технология в мире Java, однако сотрудничество со Spring по-прежнему болезненно и требует «неприятных» хаков. У меня в настоящее время проблема с одним из этих «хаков».

Сервисы Spring вводятся с использованием SpringBeanFacesELResolver. Настраивается в faces-config.xml:

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

Внедрение служб Spring очень уродливо, но работает:

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

Но есть проблемы. JSF требует от меня, чтобы управляемый компонент был сериализуемым. Это означает, что служба Spring также должна быть сериализуемой или поле должно быть временным. Когда поле временное, инъекция не работает (у меня в этом поле ноль). И делать сериализуемые службы Spring, на мой взгляд, не очень хорошая идея и потенциальные проблемы с производительностью - что должно произойти с контекстом Hibernate, источниками данных, которые все вводятся в службу Spring?

Итак, каков правильный и менее болезненный способ использования служб Spring с управляемыми компонентами JSF?


person Danubian Sailor    schedule 21.11.2012    source источник


Ответы (1)


У меня тоже было много проблем с org.springframework.web.jsf.el.SpringBeanFacesELResolver. В основном связано с несоответствием областей видимости объекта (Spring не имеет эквивалента области видимости JSF и области диалога). Некоторые люди также жалуются на проблемы с сериализацией.

Я успешно применил решение, предложенное в этой статье: http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/.

В моем случае сериализация не была проблемой, и меня интересовали только области действия bean-компонентов. Я хотел, чтобы JSF полностью управлял жизненным циклом компонентов поддержки без вмешательства в жизненный цикл компонентов Spring.

Я сделал управляемые bean-компоненты JSF для загрузки контекста Spring и самонаведения для доступа к управляемым Spring-компонентам из контекста 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);
    }
   ...
}

Затем мои конкретные поддерживающие bean-компоненты JSF выглядели так (я мог без проблем использовать область просмотра):

@ManagedBean
@ViewScoped
public class MyBackingBean extends AutowireableManagedBean {

    @Autowired
    private MyDao myDao;
person Agustí Sánchez    schedule 12.08.2015