Получить ServletContext в ресурсе JAX-RS - PullRequest
64 голосов
/ 29 ноября 2009

Я играю с JAX-RS, разворачиваюсь на Tomcat. Это в основном:

@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {

    @GET
    public String hello() {
        return "Hello World";
    }

}

Есть ли какой-нибудь способ получить ServletContext в моем ресурсе JAX-RS?

Ответы [ 5 ]

96 голосов
/ 29 ноября 2009

Кроме того, аннотация @Resource может не работать. Попробуйте это

@javax.ws.rs.core.Context 
ServletContext context;

Впрыск не произойдет, пока вы не нажмете метод обслуживания

public class MyService {
    @Context ServletContext context;

    public MyService() {
         print("Constructor " + context);  // null here     
    }

    @GET
    @Path("/thing") {               
             print("in  wizard service " + context); // available here
8 голосов
/ 06 января 2013

Как уже отмечали другие, servletContext может быть введен на уровне поля. Он также может быть введен на уровне метода:

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); 
    }
}

Это позволит вам выполнить дополнительную инициализацию с доступным servletContext.

Очевидное замечание - вам не нужно использовать имя метода setServletContext . Вы можете использовать любое имя метода, которое хотите, если вы следуете стандартному шаблону именования Java-бинов для сеттеров void setXXX (Foo foo) и используете аннотацию @Context.

6 голосов
/ 09 апреля 2015

Контекст сервлета также доступен при реализации ServletContextListener. Это позволяет легко загружать такие параметры, как строка подключения, при запуске. Вы можете определить класс слушателя в файле web.xml, который загружает вас ServletContextListener при запуске веб-приложения.

Внутри файла web.xml добавьте теги <listener> и <context-param>. <listener> указывает класс, который вызывается при запуске. Тег <context-param> определяет параметр контекста, доступный в вашем веб-приложении.

Сначала включите теги <listener> и <context-param> в файл 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>

Теперь создайте класс контекста сервлета следующим образом.

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
}

Теперь вы можете выбрать, какую статическую переменную назначить прочитанному параметру. Это позволяет считывать параметр один раз при запуске и многократно использовать его через статическую переменную, которой вы его назначаете.

5 голосов
/ 29 ноября 2009

Просто используйте инъекцию ресурса, как это,

@Resource ServletContext servletContext;
0 голосов
...