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?

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top