2017-02-01 19 views
0

Я развертываю приложение JAX-RS в JBoss EAP 6.2. Я пытаюсь получить ServletContext из класса ресурсов JAX-RS, чтобы я мог прочитать значения context-param, которые я установил в файле WEB-INF/web.xml. I.e., после того как я завладел ServletContext, я планировал позвонить ServletContext#getInitParam, чтобы получить значение. Я использую инъекцию, чтобы получить ServletContext по рекомендации here.@ Контекст не вводится ServletContext в приложении RESTEasy JAX-RS

Соответствующая часть моего web.xml является:

<servlet> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <servlet-class> 
     org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher 
    </servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>foo.MyApplication</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <url-pattern>/jax-rs/*</url-pattern> 
</servlet-mapping> 

Так я использую Resteasy, который поставляется вместе с JBoss.

Класс MyApplication является:

public class MyApplication extends Application { 

    private Set<Object> singletons = new HashSet<>(); 

    public MyApplication() { 
     singletons.add(new MyResource()); 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

& hellip; и, наконец, в классе MyResource У меня есть следующие:

@Path(...) 
public class MyResource { 

    @Context 
    ServletContext context; 

    public MyResource() { 
     // I understand context is supposed to be null here 
    } 

    // ... but it should have been injected by the time we reach the service method. 
    @Path("/somePath") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response someMethod() { 
     if (context==null) throw new RuntimeException(); 
     ... 
    } 
} 

Приведенный выше код всегда приводит к RuntimeException броска. То есть RESTEasy как-то не в состоянии ввести ServletContext. Обратите внимание, что у меня нет других проблем JAX-RS. То есть если я жёстко в context-param значения я в надежде, чтобы иметь возможность получить через `ServletContext # getInitParameter», то JAX-RS функциональность остальное работает, как ожидалось, когда WAR развертывается JBoss.

Экспериментируя дальше, я обнаружил, что в ServletContext только вводится, если я выполнить инъекцию в качестве аргумента метода службы, как это:

@Path("/somePath") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response someMethod(@Context ServletContext servletContext) { 
    ... 
} 

& hellip; однако я предпочел бы не менять API Кроме того, я хотел бы выполнить некоторые дорогостоящие инициализации, основанные на. context-param Значение раз и навсегда, а не на каждом вызове метода обслуживания.

Мои вопросы:

  1. почему не удается инъекции?
  2. Я немного устал от магии аннотаций, которая не срабатывает во время выполнения, есть ли способ получить ServletContext без использования аннотаций?
  3. В качестве альтернативы, возможен ли мой класс MyApplication для получения ServletContext и передать его классу MyResource в качестве параметра конструктора?
  4. Если все остальное не удается, я думаю, что я всегда могу прочитать и проанализировать файл web.xml самостоятельно, используя Class#getResourceAsStream?
+0

Взгляните на http://stackoverflow.com/questions/1814517/get-servletcontext-in-jax-rs-resource?noredirect11&lq=1 – gladiator

+0

@gladiator Я специально ссылаюсь на этот ответ в своем вопросе (по адресу начальный абзац) –

+1

Проверьте это: http://stackoverflow.com/questions/5434667/rest-easy-and-init-params-how-to-access – FrAn

ответ

0

Основываясь на комментарий по Фрэн, что ссылки на this answer, это то, что я в конечном итоге делает:

public class JaxRsApplication extends Application { 

    private Set<Object> singletons = new HashSet<>(); 

    public JaxRsApplication(@Context ServletContext servletContext) { 
     Assert.assertNotNull(servletContext); 
     singletons.add(new UserDatabaseResource(servletContext)); 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

& hellip; а затем, в UserDatabaseResource классе у меня есть следующий:

public UserDatabaseResource(ServletContext servletContext) { 
    Assert.assertNotNull(servletContext); 
    ... 
    String jndiNameForDatasource = servletContext.getInitParameter("whatever")) ; 
    ... 
} 

Это работает как UserDatabaseResource класса, который является моим DAL слоя одноэлементен и мне просто нужно, чтобы получить имя JNDI из источника данных для использования (от web.xml файл). Но, возможно, этот подход также работает с некоторыми незначительными корректировками для не-одиночных классов.

 Смежные вопросы

  • Нет связанных вопросов^_^