Я запускаю сервер 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) {
}
}