Obter ServletContext em recurso JAX-RS
-
06-07-2019 - |
Pergunta
Eu estou brincando com JAX-RS, implantando no Tomcat. É basicamente:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
Existe alguma maneira eu pode se apossar do ServletContext
dentro do meu recurso JAX-RS?
Solução
Além disso, anotação @Resource
pode não funcionar. Tente este
@javax.ws.rs.core.Context
ServletContext context;
A injeção não acontece até que você bateu o método de serviço
public class MyService {
@Context ServletContext context;
public MyService() {
print("Constructor " + context); // null here
}
@GET
@Path("/thing") {
print("in wizard service " + context); // available here
Outras dicas
Como outros já mencionado, o servletContext pode ser injetado no nível do campo. Ele também pode ser injetado no nível de método:
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);
}
}
Isto irá permitir que você executar inicialização adicional com a servletContext disponível.
Nota Óbvio - você não tem que usar o nome do método setServletContext . Você pode usar qualquer nome do método que você quiser, desde que você siga o padrão de nomenclatura Java Bean padrão para setters, vazio setXXX (Foo foo) e usar a anotação @Context.
O contexto servlet também está disponível quando você implementar a ServletContextListener. Isto torna mais fácil para carregar parâmetros como cadeia de ligação no arranque. Você pode definir a classe ouvinte em web.xml que carrega você ServletContextListener na inicialização de sua aplicação web.
Dentro do arquivo web.xml, adicione as tags <listener>
and <context-param>
. O <listener>
especifica a classe que é chamado na inicialização. O parâmetro de contexto tag <context-param>
define que está disponível dentro de sua aplicação web.
Em primeiro lugar, incluir as tags <listener>
and <context-param>
no arquivo 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>
Agora criar a classe de contexto de servlet como segue.
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
}
Agora você pode escolher qual variável estática para atribuir o parâmetro que você leu. Isso permite que você leia o parâmetro uma vez no arranque, e reutilizar muitos tempo através da variável estática que você atribui a ele.
injeção Apenas utilização de recursos como este,
@Resource ServletContext servletContext;