JAX-RS 리소스에서 ServletContext를 받으십시오
-
06-07-2019 - |
문제
나는 Jax-Rs와 함께 Tomcat에 배포하고 있습니다. 기본적으로 :
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
내가 잡을 수있는 방법이 있습니까? ServletContext
내 JAX-RS 리소스 내에서?
해결책
뿐만 아니라, @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 Bean Naming Pattern을 따르는 한 원하는 메소드 이름을 사용할 수 있습니다. void setxxx (foo foo) @Context 주석을 사용하십시오.
ServletContextListener를 구현할 때도 서블릿 컨텍스트를 사용할 수 있습니다. 따라서 시작시 연결 문자열과 같은 매개 변수를 쉽게로드 할 수 있습니다. 웹 애플리케이션을 시작할 때 ServletContextListener를로드하는 Web.xml에서 청취자 클래스를 정의 할 수 있습니다.
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;