2016-11-29 9 views
5

Этот вопрос был задан несколько раз before, однако ответы, похоже, не работают, и/или Джерси перешел с новыми изменениями.Как комментировать JAX-RS на интерфейсе при использовании Джерси

Я просматриваю некоторые API REST, используя JAX-RS и Jersey (версия 2.24). И я хочу аннотировать интерфейс с JAX-RS и конкретную реализацию (без каких-либо аннотаций). Однако с this patch Джерси прекратил поддерживать эту возможность. Насколько я понимаю, spec, он строго не запрещает это делать.

Если подкласс или метод реализации имеет какие-либо JAX-RS аннотаций, то все аннотации на суперкласса или метод интерфейса игнорируются.

подразумевая, что это вполне нормально. Во многих случаях полезно использовать интерфейс, и каждый сервер и клиент имеют свои соответствующие реализации.

Есть много решений там,

  1. Используйте ResourceConfig и сделать registerClasses(MyImplementation.class). Однако это не работает.
  2. Отключите конфигурацию сканирования пакета в web.xml, создайте пользовательский javax.ws.rs.Application и выполните register вашей реализации. Не работает.
  3. используйте ResourceConfig и определите обычай AbstractBinder и сделайте bind, чтобы инъекция зависимости Джерси могла найти конкретные реализации. Не работает.
  4. Используйте RESTEasy. RESTEasy, похоже, не вводит ограничения интерфейса, как в Джерси. Никогда не пробовал это сам.

Я был бы признателен, если бы кто-то мог поделиться своим опытом с этим. Любая помощь в том, как получить работу Джерси, тоже будет отличной. Что касается опции (4), действительно ли нужно переключиться? Пример кода ниже.

MyResource

package com.foo; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 


@Path("/hello") 
public interface MyResource { 

    @GET 
    public String sayHello(); 

} 

MyResourceImpl

package com.bar; 

public class MyResourceImpl implements MyResource { 

    @Override 
    public String sayHello() { 
    return "Hello Jersey"; 
    } 
} 

Также есть web.xml, который имеет сканирования пакетов с поддержкой сканирования com.foo

+0

Не работает ли этот класс класса '@ Path' на конкретном классе вместо интерфейса. Так я всегда знал, что он работает (как описано в спецификации JAX-RS). Я даже не знал, что интерфейс интерфейса anno используется для поддержки. –

+0

@dur да, cxf или resteasy могут поддержать это. Я считаю, что трикотаж намного проще настроить, чем cxf. – user30622

+1

@peeskillet работает с аннотацией '@ Path' на конкретном классе. Но это побеждает цель использования интерфейса в моем случае. Клиент и сервер должны использовать один и тот же путь API.И с вашим решением я закончу дублирование путей для клиента (мой клиент - код, сгенерированный javascript из спецификации swagger) – user30622

ответ

0

В Джерси Мы должны Помещенный @Path уровня класса на вместо интерфейса.

упаковка com.foo;

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 


@Path("/hello") 
public interface MyResource { 

    @GET 
    public String sayHello(); 

} 


MyResourceImpl 

package com.bar; 
@Path("/hello") 
public class MyResourceImpl implements MyResource { 

    @Override 
    public String sayHello() { 
    return "Hello Jersey"; 
    } 
} 
+0

Я знаю, что это работает так. Пожалуйста, см. Мои комментарии выше на @peeskillet. – user30622