为 Jersey 代理客户端解析资源接口中的模板变量

Posted

技术标签:

【中文标题】为 Jersey 代理客户端解析资源接口中的模板变量【英文标题】:Resolving Template Variable in Resource Interface for Jersey Proxy Client 【发布时间】:2018-04-29 01:58:08 【问题描述】:

我在解决接口上的类级@Path 注释时遇到问题。我将此接口传递给 Jersey 代理客户端中的 WebResourceFactory,但它立即因 IllegalStateException 而失败。

接口定义:

@Path("entity")
public interface EntityResource 
    @GET
    @Produces("*/xml")
    Entity get(@PathParam("view") EntityType view);

我得到的异常:

Exception in thread "main" java.lang.IllegalStateException: The template variable 'entity' has no value
    at org.glassfish.jersey.client.JerseyWebTarget.getUri(JerseyWebTarget.java:135)
    at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:215)
    at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:60)
    at org.glassfish.jersey.client.proxy.WebResourceFactory.invoke(WebResourceFactory.java:322)

关于如何解析“实体”模板变量的任何建议?

【问题讨论】:

【参考方案1】:

在对 jersey-proxy-client 源代码做了一些调查之后,我发现所有的模板变量都是通过方法声明上的注释来解析的。 Apache CXF 如何生成我的接口存在问题。我的@PathParam 和@Path 不匹配。 @Path 使用“实体”,我的 @PathParam 使用“视图”。它们都需要相同才能正确解析模板变量。

【讨论】:

【参考方案2】:

我遇到了类似的问题,我能够在不匹配 @Path@PathParam 值的情况下解决它。我使用了@RequestTemplate,它实际上是从entity 转换为view

@APIGatewayIntegration(
      requestTemplates =
          @RequestTemplate(
              mimeType = MediaType.APPLICATION_JSON,
              template = "\"entity\": \"$input.params('view')\""),
      type = "aws",
      contentHandling = "CONVERT_TO_TEXT",
      httpMethod = HTTP_POST_METHOD,
      passthroughBehavior = "WHEN_NO_TEMPLATES"
)

我在 AWS API GW 中使用我的接口。希望这会有用。

【讨论】:

以上是关于为 Jersey 代理客户端解析资源接口中的模板变量的主要内容,如果未能解决你的问题,请参考以下文章

在WebLogic 12c / Jersey上禁用JAX-RS资源的自动注册

apache_conf 使用ApacheConnector为Jersey 2.x客户端配置代理

java设计模式---代理模式(案例解析)

jersey+jetty+jdk8实现restful接口

jersey+jetty+jdk8实现restful接口

jersey+jetty+jdk8实现restful接口