Вопрос по service, spring, managed-bean, serializable, jsf – Как использовать сервисы Spring в бинах, управляемых JSF?

1

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

Услуги Spring вводятся с использованиемSpringBeanFacesELResolver, Это настраивается в:faces-config.xml


    
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    

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

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

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

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

Ваш Ответ

1   ответ
1

gBeanFacesELResolver. В основном относится к несопоставимым областям объекта (Spring не имеет эквивалента JSF 'с точки зрения области видимости и разговора). Некоторые люди также жалуются на проблемы с сериализацией.

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

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

Я создал управляемые bean-компоненты JSF для загрузки контекста Spring и автоматического подключения к ним доступа к управляемым Spring-компонентам из контекста JSF.

Я разработал следующий суперкласс бобов 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 выглядели так (я смог без проблем использовать область просмотра):

@ManagedBean
@ViewScoped
public class MyBackingBean extends AutowireableManagedBean {

    @Autowired
    private MyDao myDao;

Похожие вопросы