Подтвердить что ты не робот

Получить ServletContext в ресурсе JAX-RS

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

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

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

}

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

4b9b3361

Ответ 1

Кроме того, аннотация @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

Ответ 2

Контекст сервлета также доступен при реализации 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
}

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

Ответ 3

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

@Resource ServletContext servletContext;

Ответ 4

Как отмечали другие, 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); 
    }
}

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

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