首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置Spring使我可以省略applicationContext.xml

如何设置Spring使我可以省略applicationContext.xml
EN

Stack Overflow用户
提问于 2017-05-01 12:03:04
回答 2查看 2.6K关注 0票数 1

我有一个JAX应用程序,它使用spring来设置上下文。

我设立了一个AppConfig来处理这件事.就像这样。

代码语言:javascript
运行
复制
@Configuration
@ComponentScan("com.whatever")
public class AppConfig {... //etc

但是,我一直收到一个错误,因为应用程序正在寻找applicationContext.xml

代码语言:javascript
运行
复制
org.springframework.beans.factory.BeanDefinitionStoreException: 
IOException parsing XML document from class path resource [applicationContext.xml];

我想我得用我的web.xml文件做点什么.但我不太明白。这是我的web.xml

代码语言:javascript
运行
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-01 14:04:53

您将得到错误,因为泽西与Spring集成的默认方法是查找这个applicationContext.xml文件。如果您想要减少xml,需要使用WebApplicationInitializer以编程方式配置Spring

代码语言:javascript
运行
复制
@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;
    }
}

在本例中,您可以看到

代码语言:javascript
运行
复制
createWebAplicationContext(SpringAnnotationConfig.class)

只需在那里使用你的AppConfig

我们在这里要做的是自己加载Spring上下文,而当泽西查找它时,它会找到它,而不是尝试加载上下文本身(否则它会试图查找applicationContext.xml文件)。

还请参见:

票数 3
EN

Stack Overflow用户

发布于 2017-05-01 13:38:32

我能给您的最好的建议是将您的项目完全转换为spring引导,以便利用它提供的所有伟大功能。

您应该从项目中完全删除所有XML,并执行以下步骤:

TL;博士

从spring启动开始的一个简单方法是使用spring (弹簧初始化)并开始将代码迁移到新项目。

关于在现有项目中迁移到spring启动的启动步骤的说明:

Maven依赖项

添加以下依赖项并删除所有其他相关的春季依赖项。通常,如果需要任何其他依赖项,请首先检查是否有弹簧引导启动器。(还请确保您的打包是jar。如果你想要一个war,你应该遵循以下链接:转变为战争)

代码语言:javascript
运行
复制
<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可以自动捕获所有组件:

代码语言:javascript
运行
复制
@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配置类中注册泽西提供程序。

代码语言:javascript
运行
复制
@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。你可以用一种更简单的方式来做,但我认为从长远来看,它会更好地为你服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43718807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档