Spring引导RESTful服务作为WAR而不是JAR

时间:2015-07-02 09:03:49

标签: java maven spring-mvc tomcat spring-boot

我正在使用Spring-boot创建Java REST应用程序。我已经成功加载了example here,我试图将JAR文件转换为Spring文件中提供的WAR文件。我修改了我的pom.xml文件,添加:

<!-- other pom.xml conf -->
<packaging>war</packaging>

<dependencies>
    <!-- Spring -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

然后我修改了Application.java类来初始化servlet(这是Spring-boot用来替换web.xml文件的):

public class Application extends SpringBootServletInitializer {
//    public static void main(String[] args) {
//        new SpringApplicationBuilder(Application.class).run(args);
//    }

@Bean
public ServletRegistrationBean jerseyServlet() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*");
      registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyInitialization.class.getName());
    return registration;
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
}

}

我生成了.WAR文件,但是当我在Tomcat上部署它时,服务返回404.Tomcat日志也没有显示任何错误。

所以我不确定这可能是什么问题。如果您有任何想法,请分享。谢谢!

更新

最初它没有工作,因为除了SpringBootApplication注释到Application类之外,我还有其他注释。拿出那些,现在Tomcat日志显示此错误。

  

SEVERE:将上下文初始化事件发送到类org.springframework.web.context.ContextLoaderListener的侦听器实例的异常   java.lang.IllegalStateException:无法初始化上下文,因为已存在根应用程序上下文 - 检查web.xml中是否有多个ContextLoader *定义!

我不确定其他的ContextLoader是什么。

UpdateToUpdate:

好的,在将jar更新到最新版本后,使用注释@SpringBootApplication for Application.java类,应用程序启动但是当我调用我收到的其中一个服务时:

  

java.lang.ClassNotFoundException:org.glassfish.jersey.process.internal.RequestExecutorFactory

谷歌搜索说我应该添加球衣 - 普通球衣和球衣核心罐子,我做了,但它没有解决它。由于某种原因,看起来RequestExecutorFactory.class没有打包在jersey-common-2.19.jar中。

1 个答案:

答案 0 :(得分:1)

为什么0.6here中有这么多注释?

Application应足以启用自动配置。 尝试删除其他人。

并放回主要方法。

我认为你混合了两个配置tw创建一个war:pre 3.0和post 3.0 servlet容器(根据Spring Boot documentation

编辑:

我发现此question与您的问题有关。

Jersey正在加载一个Spring ApplicationContext。请参阅以下日志行:@SpringBootApplication

您是否可以更新Spring Boot版本? 至少1.20,这样您就可以使用Spring WebApplicationInitializers detected on classpath: [com.jersey.Application@148ac084, org.glassfish.jersey.server.spring.SpringWebApplicationInitializer@7807c6d3]。将Spring和Jersey集成起来会容易得多。

您可以找到一个示例here(Spring Boot官方示例)。

或者您必须排除spring-boot-starter-jersey初始值设定项