2014-10-02 7 views
1

Я понимаю, что бобы в моем main-servlet.xml находятся в детском контексте. И на основе исследований я знаю, что могу получить root ApplicationContext в моем GreetingController через WebApplicationContextUtils. Который я получу null, потому что я не определял такой корневой контекст в web.xml.Как получить бобы, определенные в main-servlet.xml от контроллера

Теперь мой вопрос: как я могу получить дочерний контекст и сделать что-то вроде childContext.getBean («forfun») без @AutoWired аннотации, я думаю, что я его протестировал, и он работает;

Заранее благодарим за чтение и информацию.

Редактировать: AutoWire ApplicationContext или реализовать ApplicationContextAware поможет вам получить как дочерний, так и корневой ApplicationContext.

Edit2: Я нашел другой способ получить контекст, созданный defaultdispacher, контекст на самом деле хранится в ServletContext атрибутов с именем org.springframework.web.servlet.FrameworkServlet.CONTEXT (servletName) должен сервлет по умолчанию. это main, вы можете получить контекст craete по умолчаниюdispacher [main-servlet.xml] со следующим кодом.

ApplicationContext context1=(WebApplicationContext) request.getSession().getServletContext().getAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.main")

Но до сих пор не понимаю, почему в методе WebApplicationContextUtils мы не можем получить доступ к контексту ребенка.

web.xml файл

<webapp> 
<servlet> 
<servlet-name>main</servlet-name> 
<servlet-class> 
org.springframework.web.servlet.DispatcherServlet 
</servlet-class> 
<init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/main-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>main</servlet-name> 
<url-pattern>/main/*</url-pattern> 
</servlet-mapping> 
</web-app> 

основного servlet.xml

<beans> 
<bean name ="/testing/*" class="springmvc.GreetingController"></bean> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
p:prefix="/WEB-INF/Jsp/" 
p:suffix=".jsp"/> 
<bean id="forfun" class="springmvc.Foo"></bean> 
</beans> 

GreetingController.java

@Controller 
public class GreetingController { 

@AutoWired 
Foo forfun;//this works even if forfun is defined in main-servlet.xml 

@RequestMapping("/testing") 
public String testing(HttpServletRequest request){ 
    ApplicationContext context = 
       WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 
     Foo f=(Foo) context.getBean("forfun");//supposed to work if i have it defined in root context 
    /* 
    I would something like this 
    ChildContext child = Utils.getChildContext(request); 
    Foo f=(Foo) child.getBean("forfun"); 
    */ 
     return "test"; 
    } 
} 
+1

Почему вы хотите получить его через 'WebApplicationContext'? –

+0

Не по практической причине просто попробуйте посмотреть, есть ли способ. – Jing

ответ

1

main-servlet.xml вы объявили выше загружается ваш DispatcherServlet.

Вы можете придать соответствующий WebApplicationContext с

@Autowired 
private WebApplicationContext context; 

и использовать его, чтобы получить какой-либо компонент, определенный в этом контексте или родителя.

Обратите внимание, что это будет работать только в том случае, если компонент, в который вы вставляете его, создается в пределах WebApplicationContext, созданного DispatcherServlet.

В качестве альтернативы, как указано в комментариях М. Дейна, имеется класс полезной полезности , который называется RequestContextUtils, который обеспечивает метод getWebApplicationContext(ServletRequest) для выполнения той же самой вещи.

+0

Большое спасибо за ответ, Итак, этот autwired WebApplicationContext должен содержать все компоненты из родительского контекста в детский контекст? – Jing

+0

@Jing Инъецируемый «WebApplicationContext» - это тот, который содержит компонент, который он вводит _into_. Если это тот, который загружен «DispatcherServlet» (дочерний элемент), вы получите доступ к «WebApplicationContext», загружаемому только «ContextLoaderListener» (родительским) **, если он существует **. –

+0

Работы ~. Просто для любопытства есть ли другой способ получить контекст без аннотации?и почему WebApplicationContextUtils.getRequiredWebApplicationContext() не получает «детский контекст»? – Jing

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