2012-03-08 4 views
23

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

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

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

Но если я добавлю тег @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 не должно быть возможным, потому что ... Любые подсказки будут приветствоваться.

Am it this on Tomcat in IntelliJ.

=== ИСКЛЮЧЕНИЕ СТЕК 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 

ответ

33

Попробуйте инъекции HttpServletRequest и HttpServletContext непосредственно:

@Context private HttpServletRequest servletRequest; 
@Context private HttpServletContext servletContext; 
+1

Большое спасибо! Хотя это не сработало так, как написано, оно дало другое исключение, и идея плюс ссылка на HttpServletRequest, а не только ServletRequest была идеальной подсказкой, чтобы выяснить, как правильно ее включить. Является ли +1 вместо проверки? – prototype

+0

Хммм это странно. Я действительно вставил код непосредственно из действующей программы. Не стесняйтесь публиковать свое решение в качестве ответа, чтобы оно могло принести пользу другим. – Perception

+0

Затем должен быть еще один элемент, который мне нужно добавить в список вещей, чтобы узнать, как работают спокойные сервисы. Знание этого также полезно. Еще раз спасибо! – prototype

23

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

@Path("/") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
List<Person> read(@Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { } 
+0

Удивительно, но это работает даже без использования Spring или другой среды CDI. – coladict

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