如何从Jersey 1.0迁移到Jersey 2.0



我正在尝试升级到Jersey 2.0,我遇到了很多麻烦,因为Jersey的groupid和artifactIds已经完全改变,我无法在Jersey文档中找到迁移计划。

我的pom.xml以前是这样的,编译后很好:

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
            <version>1.17</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server-linking</artifactId>
            <version>1.17.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.17.1</version>
        </dependency>

这些应该改成什么?这个无关的StackOverflow问题有点帮助,但我很难找到像@Ref注释移动到哪里这样的东西。


更新
  1. 看来@Ref已经不存在了,或者至少在文档中没有提到了。现在你使用UriBuilder
  2. 我在文档中找到了一个非常有用的部分,它回答了我的maven问题。
  3. HTTPBasicAuthFilter已重命名为HttpBasicAuthFilter。注意大写。
  4. Client client = Client.create();变为Client client = ClientBuilder.newClient();
  5. :

        String json = client
            .resource(getBaseUrl() + url)
            .accept(MediaType.APPLICATION_JSON_TYPE)
            .get(String.class);
    

    已成为

    String json = client
            .target(getBaseUrl())
            .path(url)
            .request(MediaType.APPLICATION_JSON_TYPE)
            .get(String.class);
    

你没有。

Jersey 2.0缺少Jersey 1.0的很多功能。与提交者告诉你的相反,有些事情现在显然是不可能实现的(例如Guice, Spring集成)。表面上看起来一切正常,但一旦你深入挖掘,你会发现很多功能仍然是坏的。

许多的1。X插件在2中不存在。X,主要是由于上述破损。

鉴于此,我建议推迟Jersey 2。X在可预见的未来。希望提交者能在来年清理这个问题。

我不得不说这是件令人头疼的事。我们目前正忙于迁移相对较大的已有3年多历史的客户端-服务器项目,我真想把自己的脖子咬掉。希望我们已经到了斗争的终点……虽然确实有一个迁移指南,但无论如何它都不全面。

  • UniformInterfaceException(和其他)不再存在。

被WebApplication异常和后继程序代替。在迁移指南中没有提到这一点,这是非常非常重要的。

    JSON支持

迁移指南说:

JSON支持在Jersey 2.x中发生了一些变化。最对于开发人员来说,明显的区别在于初始化和配置。

In Jerseyx, JAXB/JSON支持被实现为一组jersey-json模块中的MessageBodyReaders和MessageWriters。在内部,有几种JSON to Object的实现从Jersey自己的定制解决方案到第三方的映射提供商,如Jackson或Jettison。JSON的配置支持集中在JSONConfiguration和JSONJAXBContext中类。

好了。如果您选择了"Jersey的自定义解决方案"(我们出于某种原因这样做了)怎么办?在泽西岛2号没有其他选择。我尝试使用Jettison、Jackson和Moxy提供程序生成相同的JSON格式。我没有成功。作为参考,我这里没有回答的问题是:Jersey 2 JSON抛弃展开根元素

在Jersey文档中的x到2.0迁移指南。(2019链接到1.)

看起来@InjectLink@Ref的替代品。

从那个链接,我可以把这个放到我的pom.xml中:

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-declarative-linking</artifactId>
        <version>2.6</version>
    </dependency>

,然后我拿了一个现有的@Ref,并能够用@InjectLink替换掉。

public Long id; // This id is referenced below in the link
@InjectLink(resource = FavoriteResource.class, method = "updateFavorites", bindings = {
        @Binding(name = "listId", value = "${instance.id}")
})
public URI linkURI;

看起来@Ref中的一些JavaDocs甚至在@InjectLink中,这将进一步确认它是替换:

/**
 * ...
 * @Ref(resource=SomeResource.class)
 * @Ref(resource=SomeResource.class, bindings={
 *   @Binding(name="id" value="${instance.id}"}
 * )
*/
编辑:

棘手的东西。我还需要一件东西来帮我。在web.xml中,我现在有:

<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.mycompany.root</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>com.mycompany.root.web.filter.AuditResourceFilterFactory;com.mycompany.root.web.filter.OtherAuditResourceFilterFactory</param-value>
    </init-param>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.mycompany.root.web.resource.config.CustomResourceConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

最后,CustomResourceConfig.java看起来像这样

import org.glassfish.jersey.linking.DeclarativeLinkingFeature;
import org.glassfish.jersey.server.ResourceConfig;
public class CustomResourceConfig extends ResourceConfig {
    public CustomResourceConfig() {
        packages("org.glassfish.jersey.examples.linking");
        register(DeclarativeLinkingFeature.class);
    }
}

您可以按照以下步骤从Jersey 1迁移到Jersey 2:

在POM文件中添加以下依赖项:Jersey 2.23.2 dependencies

   <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>2.23.2</version>
    <exclusions>
     <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
     </exclusion>
     <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
     </exclusion>
     <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
     </exclusion>
    </exclusions>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-entity-filtering</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
    <groupId>org.glassfish.jersey.bundles.repackaged</groupId>
    <artifactId>jersey-guava</artifactId>
    <version>2.23.2</version>
   </dependency>
   <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>2.23.2</version>
      <exclusions>
       <exclusion>
        <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-annotations</artifactId>
       </exclusion>
      </exclusions>
   </dependency>
   <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.5.4</version>
   </dependency>
   <dependency>
       <groupId>org.glassfish.jersey.media</groupId>
       <artifactId>jersey-media-multipart</artifactId>
       <version>2.23.2</version>
   </dependency>
   <dependency>
       <groupId>org.jvnet</groupId>
       <artifactId>mimepull</artifactId>
       <version>1.6</version>
   </dependency>

在Web.xml中创建以下条目:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" 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_0.xsd">
 <servlet>
  <servlet-name>jersey-servlet</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
   <param-name>javax.ws.rs.Application</param-name>
   <param-value>com.jsg.resource.initializer.RestResourceInitializer</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>jersey-servlet</servlet-name>
  <url-pattern>/rest/*</url-pattern>
 </servlet-mapping> '
       <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
 </context-param>
      <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/myAppName</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>
</web-app>

在restresourceinitializer

中编写以下代码
    package com.jsg.resource.initializer;
    import java.util.HashSet;
    import java.util.Set;
    import javax.ws.rs.core.Application;
    public class RestResourceInitializer extends Application {
     /**
      * Gets the classes.
      *
      * @return the classes
      */
     public Set<Class<?>> getClasses() {
      Set<Class<?>> classes = new HashSet<Class<?>>(); 
      // Resources
      classes.add(org.glassfish.jersey.jackson.JacksonFeature.class);
      classes.add(org.glassfish.jersey.server.spring.scope.RequestContextFilter.class);
      classes.add(org.glassfish.jersey.media.multipart.MultiPartFeature.class);
                   //Rest classes within Application.
                    classes.add(com.jsg.rest.AbcRestService.class);
      classes.add(com.jsg.rest.CdeRestService.class);
      return classes;
     }
    }

现在,如果您将上述更改的代码部署到websphere上,您将得到以下异常:

Caused by: java.lang.NoSuchMethodError: javax/ws/rs/core/Application.getProperties()Ljava/util/Map; at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:287) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:311)

出现上述异常的原因是,Websphere支持JAX-RS 1实现,但是我们部署的是JAX-RS 2实现的Jersey 2代码。

解决上述异常的步骤:

所以基本上我们要做的是强迫WebSphere选择我们的Jersey 2 jar而不是默认的Jax-rs 1。对于

,我们需要遵循以下步骤

1)通过将以下JVM属性设置为true来禁用内置JAX-RS

com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true

此属性可以通过WebSphere的管理控制台进行设置:服务器->所有服务器-> ->服务器基础设施-> Java和进程管理->进程定义->附加属性-> Java虚拟机->附加属性->自定义属性

2)创建具有Jersey 2 jar和Spring 4 jar的隔离共享库隔离共享库可以通过Websphere的管理控制台通过Environment-> shared Libraries ->New

创建

在classpath框中,我们需要输入服务器上文件夹的路径,在这里我们放置了所有Jersey 2和Spring 4 jar

/var/was/server2/jerseyLib1/spring-context-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-core-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-beans-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-aop-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-web-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-expression-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-bridge-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-locator-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-api-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-utils-2.5.0-b05.jar
/var/was/server2/jerseyLib/javax.inject-2.5.0-b05.jar
/var/was/server2/jerseyLib1/javax.annotation-api-1.2-b03.jar
/var/was/server2/jerseyLib1/javax.ws.rs-api-2.0.1.jar
/var/was/server2/jerseyLib1/jersey-client-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-spring3-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-container-servlet-core-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-server-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-common-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-guava-2.23.2.jar

同样在类加载部分,选择"为这个共享库使用一个隔离的类加载器"

,最后点击应用和确定,我们完成了隔离共享库的创建。

  • 在管理控制台

    将这个隔离的共享库与应用程序war文件绑定,如下所示

    a)应用程序->所有应用程序->单击您的应用程序名称b)转到References -> Shared Library References -> Reference Shared Libraries ->选择您的应用程序war(不是ear),然后单击ok。c)在左侧的"Available"组合框中选择我们在步骤2中创建的库,并将其放在右侧的"Selected"组合框中,单击"ok"。这样,我们就将隔离的共享库与应用程序war文件关联起来了。

  • 重启服务器和应用程序应该是启动和运行。

    相关内容

    • 没有找到相关文章

    最新更新