2012-05-21 16 views
6

Chciałbym mieć metodę takiego interfejsu reszty zasobuDropwizard/Jersey: Uwierzytelnianie i parametr JSON

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
public void add(@Auth User user, @Valid Food food) { 
    //consume 
} 

Jednakże, nie jest to możliwe, ponieważ pojawia się błąd jak: "POWAŻNE: brak zależności dla metody public void com.restaurant.FoodResource.add (com.restaurant.User, com.restaurant.Food) w parametrze o indeksie 0 KOD: Brakująca zależność dla metody public void com.restaurant.FoodResource .add (com.restaurant.User, com.restaurant.Food) o parametrze na indeksie 1 POWAŻNE: Meth od, public void com.restaurant.FoodResource.add (com.restaurant.User, com.restaurant.Food), opatrzony komentarzem POST o zasobach, klasa com.restaurant.FoodResource, nie jest uznawana za prawidłową metodę zasobów.

Okazało się, że to nie jest możliwe, aby mieć dwa parametry nie opatrzone niektórych adnotacji zgodnie ze specyfikacjami (3.3.2.1 Podmiot parametry) http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html

Jakie istnieją opcje, aby jeszcze zrobić coś takiego? Te, które przychodzą mi na myśl, to obiekt, który obejmuje użytkownika i jedzenie, ale to nie wydaje się być dla mnie miłym rozwiązaniem.

Czy istnieje inny, bardziej elegancki sposób na zrobienie czegoś takiego? Czy mogę wysłać reprezentację JSON Food jako @PathParam?

+0

dziwne, zrobiłem to i pracował: 'public void modifyUser (@ Auth Użytkownik authUser, użytkownik @Valid User) '. Musiałem opublikować użytkownika, więc oddzieliłem authUser i wysłanego użytkownika. –

Odpowiedz

0

Sekcja 3.3.2.1 pomimo, że nie widzieli błędy jak można opisać za pomocą metod takich jak następuje:

public Response post(
    @Auth User user, @Valid Food food, @Context UriInfo uriInfo); 

public Response post(
    @Auth User user, @Valid Food food, @QueryParam String s); 

public Response post(
    @Auth User user, @Valid Food food, BooleanParam b); 

Więc obejście może być dodanie nieużywany @QueryParam lub @Context parametr.

+1

To jest obejście, które nie jest konieczne. Wyżej wymieniona sekcja odnosi się tylko do adnotacji z listy w sekcji 3.2. Ponieważ @Valid nie jest wymieniony na liście, traktowany jest tak, jakby nie zawierał adnotacji. –

3

Zmierzyłem się z tym samym problemem. W rzeczywistości było to spowodowane brakiem dostawcy w mojej konfiguracji testu.

W teście na jednostkę zasobów w metodzie setUpResources() użyj metody addProvider() w celu ustawienia dostawcy uwierzytelniania.

Na przykład:

addProvider(new BasicAuthProvider(<Authenticator>, <CacheBuilderSpec>)); 
0

spróbować zamienić parametry swoje metody, z

public void add(@Auth User user, @Valid Food food) 

do

public void add(@Valid Food food, @Auth User user) 
Powiązane problemy