Erhalten ServletContext in JAX-RS-Ressource
-
06-07-2019 - |
Frage
Ich spiele mit JAX-RS um, Implementierung auf Tomcat. Es ist im Grunde:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
Gibt es eine Möglichkeit, hält die ServletContext
in meiner JAX-RS-Ressource erhalten kann?
Lösung
Darüber hinaus @Resource
Anmerkung möglicherweise nicht. Versuchen Sie, diese
@javax.ws.rs.core.Context
ServletContext context;
Die Injektion geschieht nicht, bis Sie die Service-Methode treffen
public class MyService {
@Context ServletContext context;
public MyService() {
print("Constructor " + context); // null here
}
@GET
@Path("/thing") {
print("in wizard service " + context); // available here
Andere Tipps
Wie andere haben festgestellt, kann die ServletContext auf Feldebene eingespritzt werden. Es kann auch bei der Methode Ebene injiziert werden:
public static class MyService {
private ServletContext context;
private int minFoo;
public MyService() {
System.out.println("Constructor " + context); // null here
}
@Context
public void setServletContext(ServletContext context) {
System.out.println("servlet context set here");
this.context = context;
minFoo = Integer.parseInt(servletContext.getInitParameter("minFoo")).intValue();
}
@GET
@Path("/thing")
public void foo() {
System.out.println("in wizard service " + context); // available here
System.out.println("minFoo " + minFoo);
}
}
Auf diese Weise können Sie zusätzliche Initialisierung mit dem ServletContext verfügbar auszuführen.
Offensichtliche Hinweis - Sie müssen nicht die Methodennamen verwenden setServletContext . Sie können Sie einen beliebigen Methodennamen so lange wollen verwenden, wie Sie die Standard-Java Bean Namensmuster für Einrichter, void setXXX (Foo foo) und verwenden Sie die @Context Anmerkung folgen.
Der Servlet-Kontext ist auch verfügbar, wenn Sie die ServletContextListener implementieren. Dies macht es einfach Parameter zu laden, wie Verbindungszeichenfolge bei der Inbetriebnahme. Sie können die Listener-Klasse in web.xml definieren, die Sie ServletContextListener beim Start Ihrer Web-Anwendung geladen wird.
Innerhalb der Datei web.xml, fügen Sie die <listener>
and <context-param>
Tags. Die <listener>
gibt die Klasse, die beim Start aufgerufen wird. Der <context-param>
Tag definiert Kontextparameter, die innerhalb Ihrer Web-Anwendung zur Verfügung.
Als erstes sind die <listener>
and <context-param>
-Tags in der Datei web.xml:
<web-app>
<!-- ... -->
<listener>
<listener-class>com.your.package.ServletContextClass</listener-class>
</listener>
<!-- Init parameters for db connection -->
<context-param>
<param-name>your_param</param-name>
<param-value>your_param_value</param-value>
</context-param>
<!-- ... -->
</web-app>
Sie nun die Servlet-Kontext-Klasse wie folgt erstellen.
public class ServletContextClass implements ServletContextListener
{
public void contextInitialized(ServletContextEvent arg0)
{
//use the ServletContextEvent argument to access the
//parameter from the context-param
String my_param = arg0.getServletContext().getInitParameter("your_param");
}//end contextInitialized method
@Override
public void contextDestroyed(ServletContextEvent arg0)
{ }//end constextDestroyed method
}
Sie können nun wählen, welche statische Variable den Parameter, den Sie gelesen haben, zuweisen. Auf diese Weise können Sie den Parameter einmal bei der Inbetriebnahme, lesen und zu viele Zeit durch die statische Variable wiederverwenden, die Sie es zuweisen.
Verwenden Sie einfach Ressource Injektion wie diese,
@Resource ServletContext servletContext;