2015-12-28 8 views
1

Я запускаю сервер Apache Tomcat и развертываю свое приложение в качестве файла WAR на нем. Внутри приложения я создал простой ресурс REST с помощью Apache CXF.Зачем мне нужно установить ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE в ServletContext?

web.xml ссылается только на моего слушателя (ContextListener) класс. В этом классе я создаю свой контекст приложения и добавляю сервлет CXF.

Если я не укажу следующую строку, CXF не работает должным образом, хотя компонент ресурса зарегистрирован («Служба не найдена»).

Не могли бы вы объяснить, что делает эта линия, почему это необходимо и какие альтернативы существуют?

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext);

Полный файл:

import xxx.resources.DefaultResource; 
import org.apache.cxf.jaxrs.spring.SpringComponentScanServer; 
import org.apache.cxf.transport.servlet.CXFServlet; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.ServletRegistration; 

public class ContextListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     ServletContext servletContext = servletContextEvent.getServletContext(); 

     AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); 
     applicationContext.setServletContext(servletContext); 
     applicationContext.register(SpringComponentScanServer.class); 
     applicationContext.register(DefaultResource.class); 
     applicationContext.refresh(); 

     Class<CXFServlet> cxfServletClass = CXFServlet.class; 
     ServletRegistration.Dynamic servletRegistration = servletContext.addServlet(cxfServletClass.getSimpleName(), cxfServletClass); 
     servletRegistration.addMapping("/*"); 

     servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    } 

} 

ответ

0

CXFServlet (который использует Spring) использует весны WebApplicationContextUtils. Этот класс, в свою очередь, использует тот же самый ключ для извлечения контекста приложения из контекста сервлета. Другими словами, поскольку я использую CXFServlet, мне нужно использовать этот ключ для хранения контекста.