2015-03-12 5 views
5

Pisałem aplikację ReST opartą na JAX-RS z wykorzystaniem Apache Wink i zrozumiałem koncepcję asocjacji między parami ścieżek do klasy uchwytów zasobów. Tutaj widzę, że możemy zdefiniować ścieżki przy użyciu adnotacji @Path i odpowiedniego zasobu, który zostanie wywołany w oparciu o metodę HTTP.Jak napisać pojedynczy zasób JAX-RS dla zmiennej liczby parametrów ścieżki

Teraz szukam czegoś w rodzaju zasobu, który powinien zostać wywołany dla zmiennej liczby parametrów ścieżki.

Na przykład Chcę, aby moja pojedyncza klasa zasobów CollegeResource była wywoływana dla identyfikatorów URI, takich jak /rest/college, /rest/college/subject, /rest/college/subject/teachers, i może przechodzić do dowolnej liczby parametrów ścieżki.

Jeśli znam liczbę par ścieżek w przeszłości, mógłbym to osiągnąć, używając czegoś takiego: /rest/college/{param1}/{param2}. Ale liczba par ścieżek jest nieznana. Tak więc czułem (mogę się mylić) nie mogę zastosować tego podejścia.

Jeszcze jednym sposobem, jaki mógłbym jeszcze użyć, jest użycie parametrów zapytania. Ale chcę, aby to było dostępne tylko jako parametry ścieżki.

Czy jest jakikolwiek sposób na wykonanie tego zadania za pomocą mrugnięcia apache z dowolną inną konfiguracją? Jeśli nie w mrugnięciu Apache, inne implementacje JAX-RS obsługują to?

Odpowiedz

7

Można użyć wyrażeń regularnych, takich jak @Path("/college/{param: .*}"), a następnie jako parametru metody użyć List<PathSegment>. Na przykład

@GET 
@Path("/college/{params: .*}") 
public Response get(@PathParam("params") List<PathSegment> params) { 
    StringBuilder builder = new StringBuilder(); 
    for (PathSegment seg: params) { 
     builder.append(seg.getPath()); 
    } 
    return Response.ok(builder.toString()).build(); 
} 

C:\>curl -v http://localhost:8080/college/blah/hello/world/cool
Wynik:blahhelloworldcool

Ale osobiście, chciałbym zatrzymać się z dala od tego rodzaju rzeczy. Twoje ścieżki URI (szablony) powinny mieć znaczenie semantyczne. Zezwalanie na dowolną liczbę par ścieżek, które mogą nie mieć żadnego znaczenia, jest podatne na błędy, a IMO jest przyczyną przeprojektowania. Muszę znać semantykę stojącą za wyborem tego projektu, zanim będę mógł udzielić jakiejkolwiek porady.

+0

Patrzę, kiedy wywołuję RDBMS, wyślę 3 obiekty (nazwa bazy danych, nazwa schematu i nazwa tabeli) w parametrach ścieżki. Mój adres URL będzie podobny do **/api/database/dbname/schemaName/tablename **. Ale podczas wywoływania Salesforce.com wyślę tylko jeden obiekt SFDC, a mój adres URL będzie **/api/sfdc/Konto **. Tutaj nie chcę mieć wielu zasobów dla każdej docelowej aplikacji. Dlatego chcę mieć pojedynczy zasób z podstawowym identyfikatorem URI/api/{targetAppName} i może on mieć dowolną liczbę paramerów ścieżek. Mogę uzyskać dostęp do {targetAppName} w kodzie i zdecydować o docelowej aplikacji i zrobić to odpowiednio. –

+0

A chcesz, aby tylko jedna metoda zasobów obsługiwała wszystkie możliwe przypadki użycia? Jeśli tego chcesz, to przejdź do niego –

+0

Works. Ostatecznym powiedzeniem dla tego wątku byłoby, używając {params:. *}, Możemy uczynić go ogólnym. –

Powiązane problemy