对于reaseasy代理客户端,您必须至少使用一个但不超过一个http方法注释

时间:2015-04-21 03:56:25

标签: java web-services rest resteasy

我试图在休息时轻松实现一个简单的客户端,但我收到一条错误,说“你必须使用至少一个,但不能超过一个http方法注释”。在我的服务器实现中,我在我的方法上添加了一个http注释。

    @Path("/")
public class TestResource
{
    @GET
    @Path("/domain/{value}")
    public String get(@PathParam("value") final String value) {
        return "Hello" + value;
    }
}

我调试了它,第一次它没有达到运行时异常,但是,它正在进行第二次调用并失败,不知道为什么以及如何。

我的客户作为junit测试:

@Test
public void testPerformRestEasy() {

    ResteasyClient client = new ResteasyClientBuilder().build();
    ResteasyWebTarget target = client.target("http://localhost:8080/");
    TestResource proxy = target.proxy(TestResource.class);
    String response = proxy.get("user");
    Assert.assertEquals("Hellouser", response);
}

失败的代码

    private static <T> ClientInvoker createClientInvoker(Class<T> clazz, Method method, ResteasyWebTarget base, ProxyConfig config)
   {
      Set<String> httpMethods = IsHttpMethod.getHttpMethods(method);
      if (httpMethods == null || httpMethods.size() != 1)
      {
         throw new RuntimeException("You must use at least one, but no more than one http method annotation on: " + method.toString());
      }
      ClientInvoker invoker = new ClientInvoker(base, clazz, method, config);
      invoker.setHttpMethod(httpMethods.iterator().next());
      return invoker;
   }

错误:

java.lang.RuntimeException: You must use at least one, but no more than one http method annotation on: public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    at org.jboss.resteasy.client.jaxrs.ProxyBuilder.createClientInvoker(ProxyBuilder.java:76)
    at org.jboss.resteasy.client.jaxrs.ProxyBuilder.proxy(ProxyBuilder.java:52)
    at org.jboss.resteasy.client.jaxrs.ProxyBuilder.build(ProxyBuilder.java:120)
    at org.jboss.resteasy.client.jaxrs.internal.ClientWebTarget.proxy(ClientWebTarget.java:72)

有谁知道这里的问题是什么?

3 个答案:

答案 0 :(得分:3)

Resteasy JAXRS 2客户端似乎不直接接受实现类。要使其工作,您必须创建一个正确注释的界面。它由Resteasy用于生成客户端代理,您的服务器必须实现完全相同的接口。

因此,在您的情况下,您必须将代码拆分为一个接口和一个单独的实现类:

@Path("/")
public interface TestResource {
    @GET
    @Path("/domain/{value}")
    String get(@PathParam("value") final String value);
}

public class TestResourceImpl implements TestResource {
    @Override String get(final String value) {
        return "Hello" + value;
    }
}

我不确定这是否是Resteasy特定的或规范要求,但我解决了同样的问题。你可以找到给我提示here in the documentation的部分。

答案 1 :(得分:1)

您必须从客户端定义资源(@Produces/@Consumes)的MIME媒体类型资源表示。喜欢 -

@Path("/")
public class TestResource
{
    @GET
    @Produces("text/plain")
    @Path("/domain/{value}")
    public String get(@PathParam("value") final String value) {
        return "Hello" + value;
    }
} 

Jboss Client framework Doc会为您提供更多帮助。

答案 2 :(得分:0)

就我而言,Rest Client Interface的开发人员错误地扩展了RestEasyClientProxy。 Rest接口中的方法不是缺少http注释,而是继承的方法。

从Rest Client Interface代码中删除extends RestEasyClientProxy修复了该问题。