Миграция из web.xml в конфигурацию на основе Java - не удается запустить Tomcat 8
Я пытаюсь перенести web.xml моего приложения в конфигурацию на основе Java. Мы используем Spring 4.1, Java 7, Servlet 3.1, Tomcat 8 и Eclipse Luna. Платформа веб-сервиса - это Джерси 2.14.
Я использовал в основном следующее руководство: http://www.robinhowlett.com/blog/2013/02/13/spring-app-migration-from-xml-to-java-based-config/
Я создал WebApplicationInitializer, который следует конфигурации web.xml, удалил web.xml, настроил Maven не искать web.xml и успешно установил mvn clean.
Когда я пытаюсь запустить Tomcat, я получаю следующую ошибку:
'Publishing to Tomcat v8.o Server at localhost...' has encountered a problem. Resource '/sb-server/target/m2e-wtp/web-resources/WEB-INF/web.xml' does not exist.
Я попытался очистить каталог tomcat, но это не помогло, и похоже, что я что-то пропустил, так как AFAIK Tomcat 8 должен быть дружественным к Java-Based-Configuration-Friendly-Configuration.
Я пропустил шаг в миграции?
бывший web.xml (который работал как положено):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0">
<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>
com.sb.configuration.ServerConfiguration
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.sb.configuration.RestJaxRsApplication</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.tracing.type</param-name>
<param-value>ALL</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
WebApplicationInitializerImplemenatation:
@Order(Ordered.HIGHEST_PRECEDENCE)
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext container) throws ServletException {
// Set up application context
final AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
appContext.register(ServerConfiguration.class);
container.addListener(new ContextLoaderListener(appContext));
// Register listeners
container.addListener(ContextLoaderListener.class);
// Jersey Servlet configuration
final ServletRegistration.Dynamic dispatcher =
container.addServlet("Jersey REST Service", ServletContainer.class);
dispatcher.setInitParameter("javax.ws.rs.Application", "com.sb.configuration.RestJaxRsApplication");
dispatcher.setInitParameter("jersey.config.server.tracing.type", "ALL");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/api/*");
// Filters
final Dynamic filterRegistration = container.addFilter("springSecurityFilterChain", DelegatingFilterProxy.class);
filterRegistration.addMappingForUrlPatterns(null, false, "/*");
}
}
1 ответ
Есть гораздо более простой способ сделать это.
Добавьте зависимость от Servlet 3.1 в ваш файл pom
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
Сначала создайте инициализатор сервлета. Пример ниже:
public class WebAppInit implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.scan(AppConfiguration.class.getPackage().getName());
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic appServlet = servletContext.addServlet("appServlet", new DispatcherServlet(context));
appServlet.setLoadOnStartup(1);
Set<String> mappings = appServlet.addMapping("/");
if (!mappings.isEmpty()) {
throw new IllegalStateException("Conflicting mappings found! Terminating. " + mappings);
}
}
}
Конфигурация вашего приложения также нуждается в некоторых настройках. Пример ниже:
@Configuration
@EnableWebMvc
@ComponentScan("com.your.package.root")
public class AppConfiguration extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setOrder(0);
return viewResolver;
}
/**
* Spring and WEB settings from WebConfAdapt.
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
Кроме этого, больше не нужно никаких настроек. Я успешно начал свой Tomcat с этим. (Тем не менее, это было на Tomcat 7)