我有一个JAX应用程序,它使用spring来设置上下文。
我设立了一个AppConfig来处理这件事.就像这样。
@Configuration
@ComponentScan("com.whatever")
public class AppConfig {... //etc但是,我一直收到一个错误,因为应用程序正在寻找applicationContext.xml。
org.springframework.beans.factory.BeanDefinitionStoreException:
IOException parsing XML document from class path resource [applicationContext.xml];我想我得用我的web.xml文件做点什么.但我不太明白。这是我的web.xml
<web-app version="3.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd">
<listener>
<listener-class>com.whatever.etc.ApplicationListener</listener-class>
</listener>
<!-- Application -->
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
io.swagger.jaxrs.listing,
com.shutterstock.media.api
</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.scanning.recursive</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.whatever.etc.MainClass</param-value>
</init-param>
<init-param>
<param-name>dirAllowed</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<!-- used to overwrite default 4xx state pages -->
<param-name>jersey.config.server.response.setStatusOverSendError</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Swagger -->
<servlet>
<servlet-name>Jersey Swagger</servlet-name>
<servlet-class>io.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
</web-app>发布于 2017-05-01 14:04:53
您将得到错误,因为泽西与Spring集成的默认方法是查找这个applicationContext.xml文件。如果您想要减少xml,需要使用WebApplicationInitializer以编程方式配置Spring
@Order(1)
public class SpringWebContainerInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
registerContextLoaderListener(servletContext);
// Set the Jersey used property so it won't load a ContextLoaderListener
// see bug report https://java.net/jira/browse/JERSEY-2038
servletContext.setInitParameter("contextConfigLocation", "");
}
private void registerContextLoaderListener(ServletContext servletContext) {
WebApplicationContext webContext;
webContext = createWebAplicationContext(SpringAnnotationConfig.class);
servletContext.addListener(new ContextLoaderListener(webContext));
}
public WebApplicationContext createWebAplicationContext(Class... configClasses) {
AnnotationConfigWebApplicationContext context;
context = new AnnotationConfigWebApplicationContext();
context.register(configClasses);
return context;
}
}在本例中,您可以看到
createWebAplicationContext(SpringAnnotationConfig.class)只需在那里使用你的AppConfig。
我们在这里要做的是自己加载Spring上下文,而当泽西查找它时,它会找到它,而不是尝试加载上下文本身(否则它会试图查找applicationContext.xml文件)。
还请参见:
发布于 2017-05-01 13:38:32
我能给您的最好的建议是将您的项目完全转换为spring引导,以便利用它提供的所有伟大功能。
您应该从项目中完全删除所有XML,并执行以下步骤:
TL;博士
从spring启动开始的一个简单方法是使用spring (弹簧初始化)并开始将代码迁移到新项目。
关于在现有项目中迁移到spring启动的启动步骤的说明:
Maven依赖项
添加以下依赖项并删除所有其他相关的春季依赖项。通常,如果需要任何其他依赖项,请首先检查是否有弹簧引导启动器。(还请确保您的打包是jar。如果你想要一个war,你应该遵循以下链接:转变为战争)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>弹簧引导应用程序
创建一个带有@SpringBootApplication注释的类,类似于基本包中的以下内容。从这里开始,创建类只在这个包的子包中,因此spring可以自动捕获所有组件:
@SpringBootApplication
public class FooApplication {
public static void main(String[] args) {
SpringApplication.run(FooApplication .class, args);
}
}Java配置
现在,您可以轻松地在基本包下添加一个名为config的包,并通过自定义配置添加带有@Configuration注释的bean。
application.properites/yml
如果您还没有这样做,请将applicy.properties/yml添加到src/main.resources中,至少配置如下(在这里可以找到更多的属性:弹簧靴通用特性)
spring.jersey.application-path=/映射jersey端点泽西配置
您需要在扩展ResourceConfig的自定义java配置类中注册泽西提供程序。
@Configuration
public class JerseyConfiguration extends ResourceConfig {
public JerseyConfiguration() {
register(FooController.class);
register(OtherController.class);
...
}
}重要备注
完成此转换后,您不再需要web.xml了,因为spring负责为您创建servlet。您应该从项目中删除除pom.xml之外的所有XML,并将所有内容转换为java。它可以使用@ImportResource与您的XML配置共存,但不建议这样做。
为了现在用maven运行您的项目,使用maven构建命令:spring-boot:run。
如果您有系统提供的任何静态文件,请将它们从src/main/webapp移动到src/main/resources/static (更多信息在这里:静态含量)
所有这些都应该让您从spring启动开始,并允许您在保留spring引导最佳实践的同时删除applicationContext.xml。你可以用一种更简单的方式来做,但我认为从长远来看,它会更好地为你服务。
https://stackoverflow.com/questions/43718807
复制相似问题