2013-02-15 3 views
1

Я хотел бы использовать Spring Event для «говорить» с моими бобами в своем веб-приложении.Запрос на весну и масштаб весны

Так, например, мой боб, который запускает событие, как это:

@Controller 
@Scope("request") 
@KeepAlive 
public class Controller extends InitializingBean, ApplicationEventPublisherAware { 

private ApplicationEventPublisher applicationEventPublisher;  

public void test() { 
    applicationEventPublisher.publishEvent(new TestEvent(this)); 
} 

} 

И мой слушатель событий, как это:

@Component 
@Scope("request") 
@KeepAlive 
public class Module implements ApplicationListener<TestEvent> { 

    @Override 
    public void onApplicationEvent(TestEvent event) { 

    } 

} 

Наиболее важным моментом является то эти бобы запрос сфера потому что они должны быть инициализированы при каждом вызове страницы.

Но в запуске, я получаю сообщение:

вызвано следующими причинами: java.lang.IllegalStateException: Нет запроса Thread переплете найдено: Вы имеете в виду атрибуты запроса за пределами фактического веб-запроса, или обработки запроса вне исходного потока ? Если вы фактически работаете в веб-запросе и все еще получаете это сообщение, ваш код, вероятно, работает за пределами DispatcherServlet/DispatcherPortlet: В этом случае используйте RequestContextListener или RequestContextFilter, чтобы выставить текущий запрос .

Как если весна попытаться создать экземпляр моего модуля боба в запуске и в качестве компонента является запрос области применения, она не может сделать это (запрос контекста не экземпляр)

Если удалить управление событиями, все работает отлично.

Итак, мой вопрос:

Можно ли иметь слушатель события запрос сферы? И как это сделать?

Благодаря

ответ

0

Попытка придать контекстными прокси в Singleton ApplicationListener для обработки TestEvent.

@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="request") 
public class TestEventHandler { 

    public void onTestEvent(TestEvent event) 
     // ... 
    } 

} 
    public class TestEventApplicationListener implements ApplicationListener<TestEvent> { 

    @Autowired 
    private TestEventHandler handler; 

    @Override 
    public void onApplicationEvent(TestEvent event) { 

     handler.onTestEvent(event); 

    } 
} 
+0

Я не могу этого сделать, потому что Spring дает новый экземпляр при каждом вызове метода getModule и не имеет экземпляра для каждого запроса. Это проблема прокси-запроса запроса – Kiva

+0

Поскольку ваш обработчик событий не реализует ApplicationListener напрямую и получает событие через композицию (уже отфильтрованную с 3.0), ваша начальная проблема решена. Поскольку ваш обработчик событий теперь является прокси-сервером, он может быть введен в одноэлементный компонент. см. http://static.springsource.org/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection –

Смежные вопросы