Obtenir ServletContext dans l'application
Pourriez-vous expliquer comment je peux obtenir le ServletContext
exemple, dans mon Application
's sous-classe? Est-il possible? J'ai essayé de faire comme dans l'extrait suivant, mais il ne semble pas fonctionner - le ctx
n'est pas définie:
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
//...
@ApplicationPath("/")
public class MainApplication extends Application {
@Context ServletContext ctx;
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
//...
return classes;
}
}
web.xml:
<web-app ...>
<context-param>
<param-name>environment</param-name>
<param-value>development</param-value>
</context-param>
<filter>
<filter-name>jersey-filter</filter-name>
<filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>my.MainApplication</param-value>
</init-param>
</filter>
...
</web-app>
Le problème est que j'ai besoin d'obtenir des paramètres de contexte. Si il y a une autre façon, je serais reconnaissant si quelqu'un a donné une indication.
Je comprends que Context
annotation peuvent ne pas être adaptés pour cela. En fait, je n'ai pas besoin ServletContext
lui-même. Si seulement je pouvais les mettre en contexte params de web.xml, je serais parfaitement heureux.
Voici un exemple de ce que j'ai vraiment besoin de:
import java.util.HashSet;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
public class MainApplication extends Application {
@Context ServletContext ctx;
@Override
public Set<Object> getSingletons() {
Set<Object> set = new HashSet<Object>();
final String environment = ctx.getInitParameter("environment");
//final String environment = ... get context parameter from web xml
set.add(new AbstractBinder() {
@Override
protected void configure() {
bind(new BaseDataAccess(environment)).to(DataAccess.class);
}
});
//...
return set;
}
}
Grâce.
source d'informationauteur Industrious
Vous devez vous connecter pour publier un commentaire.
Depuis Jersey 2.5, ServletContext peut être injecté directement dans le constructeur:
https://java.net/jira/browse/JERSEY-2184
@Context
peut être mis à disposition surResoureConfig
par injection comme un paramètre de constructeur à l'aide de@Context
. Un autre moyen d'y accéder est par l'intermédiaire d'un gestionnaire d'événement.Essayer le code ci-dessous.
Injection se produit lorsque vous entrez méthode de service. Vérifiez si c'est un problème.
Il est intéressant exposé de la documentation pour le Jersey version 1.18 pour la classe
com.soleil.jersey.le spi.le conteneur.servlet.ServletContainer
Si ma compréhension est correcte, le constructeur suivant doit être invoced avec "une instance de la Carte qui contient tous les paramètres d'initialisation"
Ici est approprié une partie de web.xml:
Mais de toute façon il a échoué pour moi avec le message suivant:
Et pour la version actuelle de Jersey (2.5.1) il n'y a aucune déclaration de ce type documentstion:
https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/servlet/ServletContainer.html
Vous pouvez utiliser le
ApplicationEventListener
interface pour obtenir lesServletContext
. Après l'initialisation est terminée, vous pouvez "attraper" unApplicationEvent
et d'utiliser l'injection deServletContext
de travailler avec.Fonctionne très bien avec: org.glassfish.jersey : 2.12
Pour les versions supplémentaires, veuillez utiliser les commentaires - je ne sais pas, sry.
Maillot Docs - 20.1.2. Les Écouteurs D'Événement
Votre
MainApplication
:... ou alternative
MainResourceConfig
(je préfère utiliser celui-ci):Et la
ApplicationEventListener
:Ne pas utiliser
@Context
dans votreApplication
mais dans une classe de Ressource.