Получить ServletContext в ресурсе JAX-RS
Я играю с JAX-RS, разворачиваюсь на Tomcat. Это в основном:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
Есть ли способ, которым я могу овладеть ServletContext
в моем ресурсе JAX-RS?
5 ответов
Более того, @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
Как уже отмечали другие, 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.
Контекст сервлета также доступен при реализации 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
}
Теперь вы можете выбрать, какую статическую переменную назначить прочитанному параметру. Это позволяет вам прочитать параметр один раз при запуске и многократно использовать его через статическую переменную, которой вы его назначаете.
Просто используйте внедрение ресурсов, как это,
@Resource ServletContext servletContext;