将使用 jersey 1.x 的 java 代码转换为 jersey 2.x

Posted

技术标签:

【中文标题】将使用 jersey 1.x 的 java 代码转换为 jersey 2.x【英文标题】:Convert java code using jersey 1.x to jersey 2.x 【发布时间】:2021-07-04 21:01:38 【问题描述】:

我有以下适用于 jersey 1.x 的代码。但是,我需要让它与 jersey 2.x 一起使用,并且我注意到许多 jersey 类和方法从一个版本更改为另一个版本。有什么想法吗?

Client client = null;

try 
    URLConnectionClientHandler ch = new URLConnectionClientHandler(new ProxyConnectionFactory(proxyHost, proxyPort));
    client = new Client(ch);
    WebResource webResource = client.resource(url);
    ClientResponse response = ((Builder) webResource.type("application/json").header(authKey, authCreds)).post(ClientResponse.class, input);
    
    String output = (String) response.getEntity(String.class);
    System.out.println(output);
    if (response.getStatus() != 200) 
        System.out.println("Status Failed, Status: " + response.getStatus());
    
    else 
        System.out.println("Connection Successful!");
        //additional code
    
    
 catch (Exception e) 
    System.out.println("Exception occurred");
 finally 
    client.destroy();

在这段代码 sn-p 中,ProxyConnectionFactory 是一个设置代理配置的类。它实现了 HttpURLConnectionFactory,它也是一个 jersey 1.x 接口。

【问题讨论】:

【参考方案1】:

基本类型类似物如下:

Jersey 1.x Jersey 2.x
Client javax.ws.rs.client.Client
WebResource javax.ws.rs.client.WebTarget
ClientResponse javax.ws.rs.core.Response

要构建客户端,您通常使用ClientBuilder 静态构建器方法之一。最基本的使用方法是newClient() 方法,它返回Client 的新实例

Client client = ClientBuider.newClient();

如果您需要配置客户端,可以通过多种方式进行。例如,如果您需要注册一些属性或提供者,您可以:

构建时配置:

Client client = ClientBuilder.newBuilder()
        .property("...", "...")
        .register(SomeProvider.class)
        .build();

使用ClientConfig

ClientConfig config = new ClientConfig()
        .property("...", "...")
        .register(SomeProvider.class);
Client client = ClientBuilder.newClient(config);

直接配置客户端

Client client = ClientBuilder.newClient();
client.property("...", "...");
client.register(SomeProvider.class);

拥有Client 后,您希望获得WebTarget。您可以通过为 Client#target() 方法提供 URI 来实现。

Client client = ClientBuilder.newClient();
WebTarget target = client.target(uri);

如果您需要对 URI 执行任何操作,例如添加路径、查询参数或矩阵参数,您可以在 WebTarget 上执行此操作。否则,您现在将调用WebTarget#request() 方法来获取Invocation.Builder

Client client = ClientBuilder.newClient();
WebTarget target = client.target(uri);
Invocation.Builder invBuilder = target.request();

使用Invocation.Builder,您可以添加标头并最终发出请求。您不必将任何新变量分配给Invocation.Builder(或者甚至是WebTarget)。我这样做是出于演示目的。您可以继续链接方法调用。例如

Client client = ClientBuilder.newClient();
client.target(url)
        .request()
        .header(authHey, authCreds)

最后,要发出请求,您将使用Invocation.Builder 的一种 HTTP 方法。在您的情况下,它将是 post() 方法。您可以将Entity 传递给此方法,结果将是Response

Client client = ClientBuilder.newClient();
Response res = client.target(url)
        .request()
        .header(authHey, authCreds)
        .post(Entity.json(input));

要阅读回复,请使用Response#readEntity(Class)

String data = res.readEntity(String.class);

如果您有一个 POJO 类,您希望将响应反序列化,然后将该类传递给 readEntity() 方法。您将需要为预期的任何数据类型提供提供程序。例如,如果将 JSON 转换为 POJO,那么您将需要 Jackson 提供程序:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>$jersey2.version</version>
</dependency>

代理

就代理而言,Jersey 有一些您可以设置的属性

ClientProperties.PROXI_URI

Client client = ClientBuilder.newClient()
        .property(ClientProperties.PROXY_URI, String.format("%s:%s", host, port));

另见

有关 Jersey 2.x 客户端的完整文档,请参阅 the docs

【讨论】:

感谢您的回复。添加以下导入后: import javax.ws.rs.client.Client;导入 javax.ws.rs.client.ClientBuilder;我尝试使用 Client client = ClientBuilder.newClient(); 创建一个客户端;但是,执行该调用时出现错误。这是异常:线程“main”中的异常 java.lang.NoClassDefFoundError: org/glassfish/jersey/internal/util/collection/UnsafeValue at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base /java.lang.Class.privateGetDeclaredConstructors(Class.java:3296) 确保 all 你的 Jersey 依赖版本是 same 这是由于缺少依赖项。我现在可以创建客户端了。但是,响应 res = client.target(url).request().header(authKey, authCreds).post(Entity.json(input)); - 在这种情况下输入可以是字符串吗? 可以。如果您遇到超时,则服务器可能存在问题。 连接出现问题时会超时。这是代理或服务器的问题。

以上是关于将使用 jersey 1.x 的 java 代码转换为 jersey 2.x的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Swagger 与 Maven + Java + Jersey +Tomcat 集成

使用 Java 和 Jersey 客户端向 Mailchimp 受众添加新订阅者

Jersey+Spring+Maven(转)

用jersey构建REST服务系列文章

用jersey构建REST服务系列文章

jersey+maven构建restful服务