Итак, я хотел сделать что-то вроде этого:
@Component @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) public class MyBean { @Autowired HttpServletRequest request; @PreDestroy public void afterRequest() { try { System.out.println("After request..."); // use request here: } finally { System.out.println("Completed successfully..."); } } }
И я получаю следующее сообщение, ПОСЛЕ «Журналы сообщений успешно завершены ...»:
09: 19: 16 ПРЕДУПРЕЖДЕНИЕ. Сбой вызова метода уничтожения для bean-компонента с именем 'scopedTarget.myBean': java.lang.IllegalStateException: запрос с привязкой к потоку не найден. или обрабатываете запрос вне изначально полученного потока? Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter для предоставления текущего запроса.
Я не совсем уверен, что с этим делать, так как мои записи указывают, что метод уничтожения завершен успешно. Кто-нибудь знает, что происходит?
EDIT: Вот mvc-servlet.xml. Как видите, здесь мало что происходит. Все это основано на аннотациях:
mvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> <!-- properties file --> <context:property-placeholder location="app.properties" /> <context:component-scan base-package="my.package.web" /> <context:component-scan base-package="my.package.services" /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/view" p:suffix=".jspx" /> </beans>
Я никогда не получал эту работу, но в итоге я изменил код для применения @After advice для методов контроллера, что дает тот же эффект.
Если вы используете область запроса без пружины MVC, вы должны объявить org.springframework.web.context.request.RequestContextListener в слушателе веб-приложения.
org.springframework.web.context.request.RequestContextListener
<web-app> ... <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> ... </web-app>
check http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes-other-web-configuration