2012-05-21 15 views
6

Mi piacerebbe avere un metodo come questo per l'interfaccia REST di una risorsaDropwizard/Jersey: l'autenticazione e il parametro JSON

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

Tuttavia, questo non è possibile, come si ottiene un errore del tipo: "SEVERE: dipendenza mancante per metodo public void com.restaurant.FoodResource.add (com.restaurant.User, com.restaurant.Food) al parametro nell'indice 0 SEVERE: dipendenza mancante per metodo public void com.restaurant.FoodResource .add (com.restaurant.User, com.restaurant.Food) al parametro all'indice 1 SEVERE: Meth od, public void com.restaurant.FoodResource.add (com.restaurant.User, com.restaurant.Food), annotato con POST di risorsa, classe com.restaurant.FoodResource, non è riconosciuto come metodo di risorsa valido.

ho trovato che non è possibile avere due parametri non annotati con alcune annotazioni secondo le specifiche (3.3.2.1 Parametri di entità) http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html

Quali opzioni esistono per fare ancora qualcosa di simile? Quelle che mi vengono in mente sono un oggetto che incapsula User e Food, ma non mi sembra una buona soluzione.

C'è qualche altro modo più elegante per fare qualcosa di simile? Posso inviare la rappresentazione JSON Food come @PathParam? errori

+0

Strano, ho fatto questo e ho lavorato: 'public void modifyuser (@ Auth User authUser, @Valid User user) '. Avevo bisogno di postare l'utente così ho separato l'authUser e l'utente postato. –

risposta

0

Sezione 3.3.2.1 nonostante, non ho visto come si descrivono con metodi come la seguente:

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); 

Quindi una soluzione potrebbe essere quella di aggiungere un parametro non utilizzato @QueryParam o @Context.

+1

Questa soluzione non è necessaria. La sezione sopra menzionata fa riferimento solo alle annotazioni dalla lista nella sezione 3.2. Poiché @Valid non è uno di quelli elencati, viene trattato come se non avesse annotazioni. –

3

Ho affrontato lo stesso problema. In realtà ciò era dovuto a un provider mancante nella mia configurazione di test.

Nel test dell'unità di risorsa nel metodo setUpResources(), utilizzare il metodo addProvider() per impostare il provider di autenticazione.

Ad esempio:

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

provare a sostituire i parametri vostri metodi, da

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

a

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