Как обрабатывать пользовательские объекты с автопроводкой в ​​Spring 2.5 - PullRequest
1 голос
/ 25 января 2011

У меня есть старый проект, который мне нужно интегрировать с Spring 2.5.x (3.0 невозможно).

Я создал bean-компонент, который должен инициализировать свое поле userSession самостоятельно:

public class SomeBean {
    UserSession userSession;

    @PostContrust
    public void init() {
        HttpSession session = WebContext.current().getSession();
        userSession = (UserSession) session.getAttribute("userSession");
    }
}

Можно ли написать какой-нибудь обработчик автопроводки, который разрешит userSession и передаст его для автопроводки в Spring, так что мой bean выглядит так:

public class SomeBean {
    @Autowire UserSession userSession;
}

и обработчик вроде:

public class AutowireHanlder {
    public boolean isCandidate(Class<?> type) {
        return type.equals(UserSession.class);
    }

    public Object resolve(Class<?> type) {
        HttpSession session = WebContext.current().getSession();
        return (UserSession) session.getAttribute("userSession");
    }
}

1 Ответ

4 голосов
/ 25 января 2011

Я бы сделал это, используя сессионную область FactoryBean:

public class UserSessionFactoryBean extends AbstractFactoryBean<UserSession> {

    @Override
    public Class<?> getObjectType() {
        return UserSession.class;
    }

    @Override
    protected UserSession createInstance() throws Exception {
        HttpSession session = WebContext.current().getSession();
        return (UserSession) session.getAttribute("userSession");   
    }

}

Определить UserSessionFactoryBean как бин:

<bean scope="session" class="com.xyz.UserSessionFactoryBean"/>

... и тогда вы сможете автоматически подключить UserSession к любому другому компоненту.

Сложность здесь в том, что UserSessionFactoryBean должен быть в рамках сеанса (см. Документы по областям действия компонента ), поскольку он должен возвращать новое значение для каждого HttpSession. Это означает, что любой bean-компонент, к которому он автоматически подключен, должен также иметь сессионную область, иначе он потерпит неудачу. Вы можете обойти это ограничение, используя scoped-прокси .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...