To pytanie było zadawane kilka razy before, jednak odpowiedzi wydają się nie działać i/lub Jersey przeniósł się z większą ilością zmian.Jak opisywać JAX-RS na interfejsie podczas korzystania z Jersey
Udostępniam niektóre interfejsy REST API przy użyciu JAX-RS i Jersey (wersja 2.24). I chciałbym opisać interfejs z JAX-RS i konkretną implementację (bez adnotacji). Jednak od this patch Jersey przestał wspierać tę możliwość. O ile rozumiem spec, nie surowo zabrania to robić.
Jeśli podklasą lub metoda realizacja ma żadnych JAX-RS adnotacje następnie wszystkie adnotacje na nadrzędnej lub metody interfejsu są ignorowane.
sugerując, że jest to całkowicie w porządku, aby to zrobić. W wielu przypadkach dobrze jest korzystać z interfejsu, a serwer i klient mają swoje odpowiednie implementacje.
Istnieje wiele rozwiązań tam,
- Użyj
ResourceConfig
i zrobićregisterClasses(MyImplementation.class)
. Jednak to nie działa. - Wyłącz konfigurację skanowania pakietów w
web.xml
, utwórz niestandardowąjavax.ws.rs.Application
i wykonajregister
swojej implementacji. Nie działa. - użyj
ResourceConfig
i zdefiniuj niestandardowąAbstractBinder
i wykonajbind
, aby iniekcja zależności Jersey mogła znaleźć konkretne implementacje. Nie działa. - Użyj RESTEasy. RESTEasy nie wydaje się narzucać ograniczeń interfejsu, jak w Jersey. Nigdy tego nie próbowałem.
Byłbym wdzięczny, gdyby ktoś mógł podzielić się z tym swoim doświadczeniem. Pomocna jak sprawić, by praca w Jersey była również świetna. Jeśli chodzi o opcję (4), czy naprawdę trzeba się przełączyć? Przykładowy kod poniżej.
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";
}
}
też web.xml
który ma włączone skanowanie pakietów skanować com.foo
Czy to nie działa z klasą "@ ścieżka" na konkretnej klasy zamiast interfejsu. W ten sposób zawsze wiedziałem, że działa (jak opisano w specyfikacji JAX-RS). Nigdy nie wiedziałem, że interfejs klasy anno był kiedyś obsługiwany. –
@dur tak, cxf lub resteasy mogą to wspierać. Wierzę, że koszulka jest o wiele łatwiejsza w konfiguracji niż cxf. – user30622
@peeskillet działa z adnotacją '@ Path' na konkretnej klasie. Ale to niweczy cel używania interfejsu w moim przypadku. Klient i serwer muszą używać tej samej ścieżki interfejsu API.I z twoim rozwiązaniem skończę powielanie ścieżek dla klienta (moim klientem jest kod generowany przez javascript z specyfikacji swagger) – user30622