2016-11-29 10 views
5

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,

  1. Użyj ResourceConfig i zrobić registerClasses(MyImplementation.class). Jednak to nie działa.
  2. Wyłącz konfigurację skanowania pakietów w web.xml, utwórz niestandardową javax.ws.rs.Application i wykonaj register swojej implementacji. Nie działa.
  3. użyj ResourceConfig i zdefiniuj niestandardową AbstractBinder i wykonaj bind, aby iniekcja zależności Jersey mogła znaleźć konkretne implementacje. Nie działa.
  4. 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

+0

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. –

+0

@dur tak, cxf lub resteasy mogą to wspierać. Wierzę, że koszulka jest o wiele łatwiejsza w konfiguracji niż cxf. – user30622

+1

@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

Odpowiedz

0

w Jersey, powinny kładziemy @Path poziomie klasy na implementacja zamiast interfejsu.

pakiet 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

Wiem, że to działa w ten sposób. Proszę zobaczyć moje komentarze powyżej do @peeskillet. – user30622

Powiązane problemy