Вы должны использовать хотя бы одну, но не более одной аннотации метода http для reaseasy прокси-клиента

Я пытаюсь реализовать простой клиент в состоянии покоя, но получаю сообщение об ошибке: "Вы должны использовать хотя бы одну, но не более одной аннотации метода http". В моей реализации сервера я добавил http-аннотацию для моего метода.

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

Я отладил его до конца, в первый раз, когда он не попадает в исключение времени выполнения, однако он делает второй вызов и терпит неудачу, не зная, почему и как.

Мой клиент как тест джунит:

@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 ответа

Клиент 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 или требуется спецификацией, но решил ту же проблему для меня. Вы можете найти раздел, который дал мне подсказку здесь, в документации.

Вы должны определить MIME медиа-тип представления ресурса (@Produces/@Consumes) от клиента. Подобно -

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

Среда Jboss Client Doc поможет вам больше.

В моем случае разработчик клиентского интерфейса Rest ошибочно расширил RestEasyClientProxy, Не в методах Rest Interface отсутствовали http-аннотации, а унаследованные методы.

Удаление extends RestEasyClientProxy из кода клиентского интерфейса отдыха исправлена ​​проблема.

Другие вопросы по тегам