2017-10-12 2 views
0

Je tente d'écrire un exemple de service REST dans Java en utilisant des annotations au lieu d'un descripteur de déploiement.Exposer la ressource REST sous forme conditionnelle

@ApplicationPath("/services") 
public class RestApp extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> classes = new HashSet<>(); 
     classes.add(Request.class); 
     return classes; 
    } 
} 

Un échantillon Demander classe

@Path("sequence-numbers") 
public class Request { 
@POST 
    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response createInstance(SnsConfig snsConfig, @Context final HttpServletResponse servletResponse, 
       @Context final HttpServletRequest servletRequest) { 
    } 
} 

Si classes.add (Request.class) est supprimé à partir du code du @Path ("séquence numéros") ne doit pas être exposé. Mais même lorsque je commente l'instruction classes.add, la méthode post est frappée lors de l'envoi d'une requête. Est-ce que mon utilisation des annotations est incorrecte ou y a-t-il quelque chose d'autre qui puisse causer cela?

Éditer: J'ai essayé de commenter la méthode getClasses entière et cela fonctionne toujours. Je suppose que si aucune classe n'est spécifiée sous @ApplicationPath, tous les fichiers sont analysés pour la présence de @Path. La raison pour laquelle je voulais utiliser getClasses était de vérifier certaines conditions spécifiques à l'application et de décider d'ajouter ou non un class/@ Path. Existe-t-il un moyen d'exposer une ressource REST basée sur une condition?

Répondre

1

Oui, c'est possible. Si vous renvoyez un Set vide dans votre méthode getClasses() ou si vous n'écrasez pas getClasses() (ou getSingletons()) depuis javax.ws.rs.core.Application, tous les chemins seront analysés. Si vous renvoyez un ensemble non vide, seules les classes spécifiées seront publiées.

+0

Oui, je retournais un ensemble vide et c'était le problème. J'ai publié la classe correspondant à @ApplicationPath au lieu de retourner un ensemble vide et cela fonctionne très bien. – kishore