Опитвам се да получа контекста на пролетното уеб приложение от филтър.
Преди това го получавах чрез:
WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext())
Беше добре, защото получавах това, което се нарича Мисля, че контекстът на уеб приложенията на ROOT. Сега исках да преместя цялата си пролетна дефиниция така в web.xml:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext instead of default XmlWebApplicationContext. -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<!-- Custom web configuration annotated class. -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>foo.bar.WebConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Премахнах „старата“ дефиниция от web.xml:
<!-- <context-param> -->
<!-- <param-name>contextConfigLocation</param-name> -->
<!-- <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> -->
<!-- </context-param> -->
<!-- <listener> -->
<!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -->
<!-- </listener> -->
Сега нямам повече контекст на уеб приложението "ROOT", а филтърът не може да получи друг контекст на уеб приложението.
Видях, че има друго обаждане:
WebApplicationContextUtils.getWebApplicationContext(sc, attrName)
позволява да се посочи като втори аргумент "атрибут", всъщност той е контекстът на уеб приложението, което искате.
Мисля, че трябва да се обадя този метод, но аз не знам какво да поставя като втори параметър.
PS: Аз също се опитах да използвам org.springframework.web.filter.DelegatingFilterProxy, но tomcat хвърли грешката, че той не намери класически (ROOT) уеб приложение контекст:
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
Но има и друг контекст, той е просто определен по друг начин. Не е възможно да съм единственият, който се опитва да получи друг контекст, който ROOT.
Благодаря, че сте чели досега.
Отговори:
0 за отговор № 1Току-що прочетох отговора ти и да го разбрах вчера вечерта ;-) Добавих контекста на ROOT, като го дефинирах така:
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>foo.bar.WebConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
И работата му, филтърът може да достигне до услугата директно с Autowiring.
Все още имам чувството, че архитектурата ми емръсни, защото контекстът ROOT и "диспечерът" са еднакви, мисля, че това не е добра практика. Може би ще опитам по-късно да разделя "WebConfiguration" на две.
Благодаря ти все пак!