带有 Jersey 客户端版本 2.2 的 Restful WebService 调用

Posted

技术标签:

【中文标题】带有 Jersey 客户端版本 2.2 的 Restful WebService 调用【英文标题】:Restful WebService call with Jersey client version 2.2 【发布时间】:2013-08-26 05:05:55 【问题描述】:

案例

我正在尝试使用 REST 服务将用户数据提取到 Servlet 过滤器。

POM.xml

<dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

代码

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 

    Client client = ClientBuilder.newClient(new ClientConfig());

    String entity = client.target("http://localhost:8080/insame/webresources/com.insame.entity.users")
        .path("count")
        .request(MediaType.TEXT_PLAIN)
        .get(String.class);

    System.out.println("entity-------->" +entity);

休息:

@GET
@Path("count")
@Produces("text/plain")
public String countREST() 
    return String.valueOf(super.count());

问题

javax.ws.rs.ProcessingException: java.net.SocketException: Unexpected end of file from server
at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:202)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:215)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:650)

WARNING:   StandardWrapperValve[com.insame.service.ApplicationConfig]: Servlet.service() for servlet com.insame.service.ApplicationConfig threw exception
javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:904)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:749)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:88)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:650)

问题

0) 我的代码有什么问题?

1) 使用 servlet 过滤器获取数据的最明智方法是什么 REST + JPA?

2) 如果有其他方法可以做到这一点,我的意思是, 请告诉我?

3) Jersey 客户端是唯一的方法

4) 我该怎么做 获取 EntityManager 并直接从过滤器调用其余服务 没有 Jersey 客户端?

泽西文档和示例: http://jersey.java.net/documentation/latest/user-guide.html#d0e2481

谢谢, 萨米人

【问题讨论】:

您要计算到达您网址的请求数吗? 【参考方案1】:

0) 500 错误代码表示服务器端有问题。即使 REST 已处理,操作操作也可能引发了一些错误。 1) 对于简单的 REST,我使用了 Restlet 和 HttpClient。甚至带有 JAXB 的 jerseyClient 也可以将响应作为 POJO 进行处理。根据我的经验,简单的 HTTP 是处理 REST 响应的最佳和最简单的方法。您可以轻松地在 http 代码 (java.net) 上编写一个包装器来处理请求/响应,围绕它创建 Dom 2) 和 3) 上面都有回答

【讨论】:

以上是关于带有 Jersey 客户端版本 2.2 的 Restful WebService 调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 JAX-RS Jersey 2.2 获取带有 Content-Type 和 Accept 标头的请求

Jersey 2 - 带有 .target HTTPS

RxJava jersey客户端,带有使用WebResourceFactory构建的代理

jersey 2.2 和 Spring Security 3 依赖项?

Jersey 2.2:输出 xml 正常,但在 json 上失败

带有 Jersey 2 的气氛 PubSub