【问题标题】:Spring boot RESTful service as WAR not JARSpring Boot RESTful 服务作为 WAR 而不是 JAR
【发布时间】:2015-07-02 09:03:48
【问题描述】:

我正在使用 Spring-boot 创建 Java REST 应用程序。我已成功加载example here,并尝试将 JAR 文件转换为 Spring-boot 站点上显示的 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 日志也没有显示任何错误。

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


更新:

最初它不起作用,因为除了 Application 类的 SpringBootApplication 注释之外,我还有其他注释。取出这些,现在 Tomcat 日志显示此错误。

严重:向 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

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

【问题讨论】:

  • 你用@SpringBootApplication注释类Application了吗?
  • 是的,我确实用'@SpringBootApplication'注释了Application类,并创建了:public @interface SpringBootApplication {}(我不确定这是否正确。)
  • 这个注解来自spring boot,不能自己创建。在 github 上发布您的项目 - 您在此处粘贴的文件之外有问题
  • 好的,这里是github项目github.com/elf11/Spring-boot/tree/master/…(我删除了为SpringBootApplication创建的接口)
  • 首先 - 你真的需要 Jersey 作为 REST 端点吗?如果您这样做,请先查看github.com/spring-projects/spring-boot/tree/master/… - 在您的代码中,我感觉您让事情变得过于复杂(pom 中的依赖项)。

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


【解决方案1】:

你的Applicationhere为什么有这么多注解?

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

然后放回main方法。

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

编辑:

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

Jersey 正在加载一个 Spring ApplicationContext。看到这行日志:Spring WebApplicationInitializers detected on classpath: [com.jersey.Application@148ac084, org.glassfish.jersey.server.spring.SpringWebApplicationInitializer@7807c6d3]

您可以更新您的 Spring Boot 版本吗? 至少 1.20,这样您就可以使用spring-boot-starter-jersey。集成 Spring 和 Jersey 会容易得多。

你可以找到一个例子here(Spring Boot官方例子)。

或者你必须排除初始化器的org.glassfish.jersey.server.spring.SpringWebApplicationInitializer

【讨论】:

  • SpringBootApplication 注解不起作用,我使用的是 Springboot 1.1.9 版本并且该注解不存在,因此其他 3 个注解应该是等效的。除此之外,我根据该链接添加了主要方法,但如果我在外部 Tomcat 上部署战争,我在日志中没有错误。我尝试使用 java -jar myApp.war 运行战争,我得到 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to load bean class 。它没有找到 WebMvcConfigurerAdapter.class
  • 我会在github上检查你的项目,看看能不能解决问题。如果是这样,我将创建一个拉取请求。
  • 另外,我刚刚创建了一个 pull request,具有新的配置和版本以集成 Spring Boot 和 Jersey
  • 嘿,谢谢你的帮助,但是你的 pull-request 把我的项目带到了我的位置,我收到了这个错误:java.lang.NoClassDefFoundError: org/glassfish/jersey /process/internal/RequestExecutorFactory [..] 引起:java.lang.ClassNotFoundException: org.glassfish.jersey.process.internal.RequestExecutorFactory
猜你喜欢
  • 2013-11-18
  • 2014-07-30
  • 2018-10-31
  • 2018-10-25
  • 2018-06-26
  • 2019-12-10
  • 2018-07-21
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多