Я хотел бы использовать область запроса beans в моем приложении. Я использую JUnit4 для тестирования. Если я попытаюсь создать его в тесте, например:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/TestScopedBeans-context.xml" })
public class TestScopedBeans {
protected final static Logger logger = Logger
.getLogger(TestScopedBeans.class);
@Resource
private Object tObj;
@Test
public void testBean() {
logger.debug(tObj);
}
@Test
public void testBean2() {
logger.debug(tObj);
}
Следующее определение bean:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="java.lang.Object" id="tObj" scope="request" />
</beans>
И я получаю:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gov.nasa.arc.cx.sor.query.TestScopedBeans': Injection of resource fields failed; nested exception is java.lang.IllegalStateException: No Scope registered for scope 'request'
<...SNIP...>
Caused by: java.lang.IllegalStateException: No Scope registered for scope 'request'
Итак, я нашел этот блог полезным: http://www.javathinking.com/2009/06/no-scope-registered-for-scope-request_5.html
Но я заметил, что он использует AbstractDependencyInjectionSpringContextTests, который, как представляется, устарел в Spring 3.0. Я использую Spring 2.5 в это время, но думал, что не должно быть слишком сложно переключить этот метод, чтобы использовать AbstractJUnit4SpringContextTests как предлагают документы (ok, ссылка docs на версию 3.8, но я использую 4.4). Поэтому я меняю тест, чтобы расширить AbstractJUnit4SpringContextTests... то же сообщение. Та же проблема. И теперь метод prepareTestInstance(), который я хочу для переопределения не определено. Хорошо, может быть, я положу эти вызовы registerScope в другое место... Поэтому я больше читал о TestExecutionListeners и думаю, что было бы лучше, так как я не хотят наследовать структуру пакета Spring. Так Я изменил свой тест на:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/TestScopedBeans-context.xml" })
@TestExecutionListeners({})
public class TestScopedBeans {
ожидая, что мне нужно будет создать пользовательский прослушиватель, но я, когда я его запустил. Оно работает! Отлично, но почему? Я не вижу, где кто-либо из слушателей регистрируют область запроса или область сеанса и почему они? я не хочу сказать, что это еще не все, это может быть не тест для Spring кода MVC...