Получить HttpServletRequest в приложении Jax Rs/Appfuse?

Я создал базовую оболочку приложения с помощью AppFuse и следовал руководству по AppFuse, чтобы создать простую службу RESTful с помощью Jax-RS. Это прекрасно работает. Вызов http://localhost:8080/services/api/persons возвращает коллекцию объектов Person в виде строки в формате Json с правильными данными.

Теперь я хотел бы получить доступ к объектам ServletRequest и ServletResponse из службы RESTful, предоставляемой Appfuse (чтобы использовать другую библиотеку, для которой требуются эти объекты).

Я думаю, что это можно сделать, добавив аннотацию @Context, например после этого сообщения StackOverflow и этого сообщение на форуме.

Но если я добавлю тег @Context (см. ниже), он компилируется нормально, но выдает исключение при перезапуске сервера (прикреплен внизу).

Вот объявление @WebService:

@WebService
@Path("/persons")
public interface PersonManager extends GenericManager<Person, Long> {
    @Path("/")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    List<Person> read();
    ...
}

А вот класс реализации, в котором, я думаю, я бы назвал аннотацию @Context:

@Service("personManager") 
public class PersonManagerImpl extends GenericManagerImpl<Person, Long> implements PersonManager { 
    PersonDao personDao; 
    @Context ServletRequest request; // Exception thrown on launch if this is present 
    @Context ServletContext context;  // Exception thrown on launch of this is present 
    ... 
    } 

Надеюсь, я упустил что-то простое, либо что-то, что нужно включить, чтобы заставить его работать, либо осознал, что получение ServletRequest не должно быть возможным, потому что... Любые подсказки будут приветствоваться.

Я запускаю это на Tomcat в IntelliJ.

=== ИСКЛЮЧЕНИЕ СТЕКА ТРАССЫ (усеченное) ===

Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are: 
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'serviceBeans' threw exception; nested exception is java.lang.RuntimeException: java.lang.NullPointerException 
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) 
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) 
        ... 37 more 

person prototype    schedule 08.03.2012    source источник


Ответы (2)


Попробуйте ввести HttpServletRequest и HttpServletContext напрямую:

@Context private HttpServletRequest servletRequest;
@Context private HttpServletContext servletContext;
person Perception    schedule 08.03.2012
comment
Большое спасибо! Хотя это не работало точно так, как написано, оно дало другое исключение, и это плюс идея ссылки на HttpServletRequest, а не только на ServletRequest, было идеальным ключом к выяснению того, как правильно его включить. Подходит ли +1 вместо проверки? - person prototype; 09.03.2012
comment
Хм, странно. На самом деле я вставил код прямо из работающей программы. Не стесняйтесь публиковать свое решение в качестве ответа, чтобы оно могло принести пользу другим. - person Perception; 09.03.2012
comment
Затем должен быть еще один пункт, который мне нужно добавить в мой список вещей, чтобы узнать, как работают службы отдыха. Знать это тоже полезно. Еще раз спасибо! - person prototype; 09.03.2012
comment
Эта опция заставляет вас использовать переменную экземпляра, вы можете использовать ее как параметр метода для ввода запроса, переменных ответа - person webjockey; 03.10.2016

Добавление его в сигнатуру метода сработало. Я предполагаю, что это потому, что объекты запроса и ответа еще не существуют, когда класс создается, но существует при вызове браузером.

@Path("/")
@GET
@Produces(MediaType.APPLICATION_JSON)
List<Person> read( @Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { }
person prototype    schedule 09.03.2012
comment
Удивительно, но это работает даже без использования Spring или другой среды CDI. - person coladict; 18.07.2017