Получить HttpServletRequest в приложении Jax Rs / Appfuse?
Я создал базовую оболочку приложения с помощью AppFuse и следовал руководству по AppFuse для создания простого сервиса RESTful с Jax-RS. Это работает просто отлично. Вызов http://localhost:8080/services/api/persons
возвращает коллекцию объектов Person в виде строки в формате Json с правильными данными.
Теперь я хотел бы получить доступ к ServletRequest
а также ServletResponse
объекты из службы RESTful, предоставляемые Appfuse (для использования другой библиотеки, которая требует эти объекты).
Я думаю, что это можно сделать, добавив аннотацию @Context, например, следуя этому сообщению Stackru и этому сообщению на форуме.
Но если я добавлю тег @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.
=== ИСКЛЮЧЕНИЕ STACK TRACE (усечено) ===
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
2 ответа
Попробуйте ввести HttpServletRequest
а также HttpServletContext
непосредственно:
@Context private HttpServletRequest servletRequest;
@Context private HttpServletContext servletContext;
Добавление его в подпись метода сработало. Я предполагаю, что это потому, что объекты запроса и ответа еще не существуют, когда создается экземпляр класса, но существуют при вызове браузером.
@Path("/")
@GET
@Produces(MediaType.APPLICATION_JSON)
List<Person> read( @Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { }