2013-06-05 9 views
11

non so se il titolo è confusa, ma cerchiamo di dire che ho questa interfaccia:È possibile definire un'interfaccia di servizio jax-rs separata dalla sua implementazione (con eclissi e jersey)?

@Produces(MediaType.APPLICATION_JSON) 
@Path("/user") 
public interface UserService { 

    @GET 
    @Path("/{userId}") 
    public Response getUser(@PathParam("userId") Long userId); 

} 

Perché quando cerco di implementare una versione di Eclipse riscrive l'annotazione per il metodo sottoposto a override, ma non per la classe?

class UserServiceImpl implements UserService { 

    @Override 
    @GET 
    @Path("/{userId}") 
    public Response getUser(@PathParam("userId") Long userId) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

Stavo cercando di creare una definizione standard per il servizio Web restful e quindi avere diverse implementazioni. È qualcosa di simile a questo con jax-rs standard? Sto usando annotazioni sbagliate per caso?

risposta

18

È possibile utilizzare l'annotazione eredità solo se non si utilizza alcun jax-rs annotazioni sulla classe che implementa: si afferma nella sezione 3.6 di JSR-339.

Si ridefinisce @Path e @Produces per il metodo ma non per la classe.

Così il Path annotazioni nel codice dovrebbe essere sulla classe concreta:

public interface UserService { 

    @GET 
    @Path("/{userId}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getUser(@PathParam("userId") Long userId); 

} 


@Path("/user") 
class UserServiceImpl implements UserService { 

    @Override 
    @GET 
    @Path("/{userId}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getUser(@PathParam("userId") Long userId) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

BTW, la specifica ci incoraggia a replicare le annotazioni sulle classi concrete:

Per coerenza con altri Specifiche Java EE, si consiglia di ripetere sempre le annotazioni, invece, di affidarsi all'ereditarietà delle annotazioni.

+0

in realtà non è necessario inserire le annotazioni sia sull'interfaccia che sul calcestruzzo. puoi semplicemente mettere tutto sull'interfaccia eccetto per @Path sulla classe (@Path ("/ utente")). – shlomi33

+2

intendevo dire che puoi lasciarlo sull'interfaccia no sul cemento. in questo modo è possibile rendere l'interfaccia disponibile per un proxy client. – shlomi33

+0

@ shlomi33 Hai ragione, ma non è una pratica incoraggiata. Forse dopo l'ultima modifica è meglio affermarlo. –

Problemi correlati