当前位置: 首页 > 知识库问答 >
问题:

Jboss 7上的泽西2

程瑞
2023-03-14

有人成功部署了Jersey 2吗。带JBoss 7的x。x?我曾尝试在JBoss 7.1.1中部署Jersey 2.5,但遇到以下错误:

"java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;"

我认为这个问题是因为JBoss与RestEasy捆绑在一起,RestEasy是一个JAX-RS 1.0实现,而Jersey是一个JAX-RS 2.0实现。因此,我采取以下步骤禁用RestEasy:

1)在我的web.xml中添加了以下内容:

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.resources</param-name>
    <param-value>false</param-value>
</context-param>

2)按照这里的讨论,我修改了JBoss的standalone.xml、module.xml和domain.xml,删除了对JAXRS1.1/RestEasy的所有引用。

3)这导致了另一个错误:java.lang.NoClassDefFoundError: org/ectivtweb/ash/ClassVisitor,我通过将以下内容添加到我的pom.xml解决了这个问题:

<dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
</dependency>

最后,我的应用程序部署没有错误,但现在我似乎无法访问我的任何Jersey资源。然而,8号码头工作正常。我也能跑1号球衣。x而不必采取步骤#2和#3,但我更喜欢使用Jersey 2。x,如果可能。

此外,我还尝试创建jboss部署结构。但是我仍然会遇到以前的错误,比如“java.lang.NoSuchMethodError:javax.ws.rs.core.Application.getProperties()Ljava/util/Map;”

<?xml version="1.0" encoding="UTF-8"?>  
<jboss-deployment-structure>
  <deployment>
    <exclusions>
            <module name="org.jboss.resteasy.resteasy-atom-provider"/>  
            <module name="org.jboss.resteasy.resteasy-cdi"/>  
            <module name="org.jboss.resteasy.resteasy-jackson-provider"/>  
            <module name="org.jboss.resteasy.resteasy-jaxb-provider"/>  
            <module name="org.jboss.resteasy.resteasy-jaxrs"/>  
            <module name="org.jboss.resteasy.resteasy-jettison-provider"/>  
            <module name="org.jboss.resteasy.resteasy-jsapi"/>  
            <module name="org.jboss.resteasy.resteasy-multipart-provider"/>  
            <module name="org.jboss.resteasy.resteasy-yaml-provider"/>  
            <module name="org.apache.log4j"/>  
            <module name="org.apache.commons.pool"/>  
            <module name="javax.ws.rs.api"/>
    </exclusions>
  </deployment>
</jboss-deployment-structure>

有人在Jboss和Jersey 2上有什么运气吗。x?任何帮助都将不胜感激。

共有3个答案

龙志勇
2023-03-14

我有几乎相同的问题(https://stackoverflow.com/a/38273524/4534078):

“需要运行Jersey 2.23.1 web应用程序,该应用程序已经在JBoss 7.1.1中的Tomcat7上运行。”

不幸的是,这里什么都不适合我,但有些片段很方便,可以帮助我找到最终的解决方案:

>

<context-param>
  <param-name>resteasy.scan</param-name>
  <param-value>false</param-value>
</context-param>
<context-param> 
  <param-name>resteasy.scan.providers</param-name>
  <param-value>false</param-value>
</context-param>
<context-param>
  <param-name>resteasy.scan.resources</param-name>
  <param-value>false</param-value>
</context-param>

从standalone.xml.中删除所有带有“jaxrs”的标签,否则您仍然会面临LinkageError,因为JBoss保持1.1规范“打开”。

创建你的pp.war!WEB-INF\jboss-deployment-structure.xml就像这里指出的那样:https://docs.jboss.org/author/display/AS7/Class在AS7中加载#ClassLoadinginAS7-JBossDeploymentstructure File

这样不仅可以:

<代码>java。lang.NoSuchMethodError:javax。ws。rs.core。应用getProperties()Ljava/util/Map

不显示,但JAXB也可以正常工作(javax.xml.bind.JAXBException的NoClassNotFoundExceptiononce-modulejavax.xml.bind.api也被激活)。

Obs1:原来的问题是将jersey 1. x与jersey 2. x混合。jersey 2. x中没有PojoMappingFeature,基本包是org.glassfish.jersey。看看https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

Obs2:我还尝试了其他方法,比如扩展ResourceConfig并从那里扫描包或直接注册类。没有什么比第3项中的正确留档更有效了。所以保持我的servlet不变:

    <servlet>
      <servlet-name>WebNize REST Service</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
      <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>br.com.webnize.rest.service</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
      <servlet-name>WebNize REST Service</servlet-name>
      <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

我希望它有帮助!

易奇希
2023-03-14

这和这个问题类似

所以有点复制/粘贴,只是不同的子系统在发挥作用。

您应该将jaxrs子系统排除在您的部署激活之外,并将其添加到META-INF/jboss部署结构中。xml

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
      <deployment>
         <!-- exclude-subsystem prevents a subsystems deployment unit processors running on a deployment -->
         <!-- which gives basically the same effect as removing the subsystem, but it only affects single deployment -->
         <exclude-subsystems>
            <subsystem name="jaxrs" />
        </exclude-subsystems>

         <!-- This is needed in any case even if you don't use exclude-subsystem above-->        
         <exclusions>  
          <module name="javax.ws.rs.api" />  
        </exclusions>  
      <deployment>
     </jboss-deployment-structure>

或者您可以转到standalone.xml并删除那里的子系统。为此,您需要删除

<subsystem xmlns="urn:jboss:domain:jaxrs:1.x">
...
...
<subsystem>

配置的一部分,顶部的扩展部分可以保留它不会伤害任何一种方式。或者您可以使用CLI连接到服务器并运行

/subsystem=jaxrs:remove()

在任何情况下,我都建议阅读AS7中有关类加载的部分https://docs.jboss.org/author/display/AS72/ClassAS7中加载

请注意,排除子系统功能和部署结构:1.2是在7.1.2中添加的,因此在7.1.1上不起作用。

您仍然可以删除jaxrs子系统,但这会影响整个服务器。

越安翔
2023-03-14

如果配置JBoss部署结构,可以在JBoss 7上使用Jersey 2。类似于以下内容的xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>

<exclude-subsystems>
  <subsystem name="resteasy" />
</exclude-subsystems>

<exclusions>
  <module name="javaee.api" />
  <module name="javax.ws.rs.api"/>
  <module name="org.jboss.resteasy.resteasy-jaxrs" />
</exclusions>

<local-last value="true" />

</deployment>
</jboss-deployment-structure>

因为JBoss 7包含模块的依赖项,所以排除resteasy模块本身是不够的,但需要排除整个javaee。api模块。还要确保不要排除太多的模块。这也可能破坏您的应用程序-上面的示例足以禁用resteasy。

正如您已经发现的,您仍然需要在web中包含以下行。xml

  <context-param>
   <param-name>resteasy.scan</param-name>
   <param-value>false</param-value>
  </context-param>
  <context-param> 
   <param-name>resteasy.scan.providers</param-name>
   <param-value>false</param-value>
  </context-param>
  <context-param>
   <param-name>resteasy.scan.resources</param-name>
   <param-value>false</param-value>
  </context-param>
 类似资料:
  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我设计了一个多部分Jersey REST服务,如下所示,用于接收多部分请求(文件上传)并将文件保存在磁盘位置: 我的测试客户是: 但我无法得到回应。 当我使用HTML网页作为客户端通过调用REST服务上传文件时,它工作得很好,但从REST客户端它不工作。 客户有什么需要更改的吗?

  • 当我尝试在Linux服务器上的Tomcat上使用(“sudo服务tomcat7启动”)实现下面的方法时,除了这个方法之外,其他所有方法都可以正常工作。 奇怪的是,当我在Eclipse中“在服务器上运行”时,这个方法工作得很好。 以下是我收到的错误消息: HTTP状态500- 类型异常报告 消息 说明服务器遇到内部错误(),无法满足此请求。 例外 javax。servlet。ServletExcep

  • 当我试图上传文件到泽西岛时,我发现下面有一些异常,请帮助我解决。谢谢 html文档:- 阿贾克斯:- Java代码:- 例外情况:- 2015年6月17日下午7:55:34组织。阿帕奇。卡塔琳娜。果心StandardWrapperValve调用 请求头:-

  • 我正在创建一个API上传文件使用泽西。 } } 当我执行curl-v-X POST时——form file=@rt.txt url 我哪里做错了?

  • 问题内容: 我在Spring启动项目中有一个与Jackson配置有关的问题 如Spring Boot博客中所述 我尝试自定义对象序列化。 在我的配置中添加新的配置bean之后 当我尝试输出类User的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES中 json输出是: 并不是 也许我需要在Jersey配置中注册一些东西才能激活我的自定义ob