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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top