Springboot 与 RestEasy 集成并部署到 Jboss 服务器

Posted

技术标签:

【中文标题】Springboot 与 RestEasy 集成并部署到 Jboss 服务器【英文标题】:Springboot integration with RestEasy and deploying to Jboss server 【发布时间】:2018-01-01 06:58:15 【问题描述】:

我想将 Spring Boot 与 RestEasy 集成。 我通过引用 link 开始使用 Paypal Springboot starter

我已经添加了上面链接中提到的 paypal resteasy 依赖项。 但是在部署到 Jboss 服务器时出现以下错误:

Caused by: java.lang.NoClassDefFoundError: org/jboss/resteasy/spi/NotImplementedYetException
    at java.lang.Class.getDeclaredConstructors0(Native Method) [rt.jar:1.8.0_131]
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) [rt.jar:1.8.0_131]
    at java.lang.Class.getConstructor0(Unknown Source) [rt.jar:1.8.0_131]
    at java.lang.Class.newInstance(Unknown Source) [rt.jar:1.8.0_131]
    at org.jboss.as.web.deployment.ServletContainerInitializerDeploymentProcessor.loadSci(ServletContainerInitializerDeploymentProcessor.java:194)
    at org.jboss.as.web.deployment.ServletContainerInitializerDeploymentProcessor.deploy(ServletContainerInitializerDeploymentProcessor.java:131)

有人可以建议我将 Springboot 与 RestEasy 集成的最佳方法吗?

【问题讨论】:

如果你使用的是spring boot,jar不应该已经有嵌入式服务器吗?为什么需要部署到另一台服务器? 我同意,它适用于 Spring boot Embedded 服务器。但是,在我们的项目中,我们在生产中拥有 Jboss 服务器,并且我们只能在 Jboss 服务器上部署...... 【参考方案1】:

这里似乎是两个独立的问题:如何集成 RESTEasy,以及如何部署到 JBoss。

RESTEasy:您提到的用于 RESTEasy 的 Paypal 启动器已转移到新家。 https://github.com/resteasy/resteasy-spring-boot/blob/master/mds/USAGE.md 最新版本运行良好。 (我不知道你使用的版本之后发生了什么变化。)

JBoss: 将自托管 Spring Boot 应用程序转换为在 JBoss 上运行的应用程序需要几个步骤,从您的文章中并不清楚您已经进行了哪些更改。

1) 在您的 pom.xml 中,将包装从 jar 更改为 war。

2) 同样在 pom.xml 中,从任何试图引入它的依赖项中排除 spring-boot-starter-tomcat。通常这是 spring-boot-starter-web,但如果您使用的是 resteasy-spring-boot -starter 你会从那个中排除。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>

3) 更改main 类并使其扩展SpringBootServletInitializer

4) 同样在main 中覆盖configure 方法。 (有些文章省略了这一步——它与确保您的组件被正确扫描有关,因此可能有一些方法可以配置项目,因此它是可选的。)

public class NameOfMyMainClass extends SpringBootServletInitializer 

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(NameOfMyMainClass.class);
    

    public static void main(String[] args) 
        SpringApplication.run(NameOfMyMainClass.class, args);
    

这些步骤详细写在这里:https://thepracticaldeveloper.com/2018/08/06/how-to-deploy-a-spring-boot-war-in-wildfly-jboss/

理论上,这就是您所需要的。但在实践中,我从来没有让它工作(Spring Boot 2.0.4,JBoss 7.1。)

第一个问题:Spring Boot 2 显然需要 JBoss 7。直到我在 JBoss 6 上浪费了一些时间后才知道这一点。 第二个问题:即使在升级服务器之后,我的 JAX-RS bean 也无法正常工作。根据下面的文章,JBoss 7.1.1 没有完全集成,需要一些额外的解决方法:https://ilya-murzinov.github.io/articles/spring-boot-jboss/

有些文章声称成功,但请注意他们倾向于使用 Wildfly,而不是 JBoss。 (也有可能 JBoss 7.0 没有所有这些问题。)因此,如果您正在关注其中一篇文章,请确保它们使用的是您可以使用的 Spring Boot 和 JBoss 版本。

【讨论】:

以上是关于Springboot 与 RestEasy 集成并部署到 Jboss 服务器的主要内容,如果未能解决你的问题,请参考以下文章

关于spring resteasy 集成jar包冲突问题

Springboot 使用 SAML 与 IDP 集成,并提供 .pem 文件

Hadoop Jersey 与 Wildfly resteasy 发生冲突

RESTEasy with Undertow,访问 HttpServletRequest

Grafana 与 springboot 和 postgres 的集成

RESTEasy 与 Apache Ant