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