2012-03-13 2 views
2

У меня есть пружинный компонент, который использовался в качестве конечной точки гибкого света (с использованием @RemotingDestination), и теперь мне нужно его повторно использовать как конечную точку REST.Почему мой весенний компонент не доступен для WebApplicationContext?

Что я сделал, так это создание дополнительного сервлета для отдыха (типа DispatcherServlet of courser) в дополнение к существующему сервлету blaze-ds, который у меня был.

Я тогда хотел получить доступ те же компоненты, с помощью REST (отсюда мой предыдущий question), и я обнаружил, что я получаю 404.

Мой конфигурационный файл покоя servlet.xml смотрел что-то вроде:

<mvc:annotation-driven /> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <property name="supportedMediaTypes" value="application/json" /> 
</bean> 

И мой ContextLoaderListener использует все мои контекстные файлы весны, в которые входит компонентное сканирование этих компонентов.

Поскольку гибкий сервлет не имел проблем с доступом к этим компонентам @Component, которые были отсканированы глобальным контекстом, я предположил, что у остального-сервлета также будет доступ к ним, и мне просто нужно добавить аннотации к компонентам.

Странная часть заключалась в том, что, когда я явно добавил компонентное сканирование для пакета, в котором находятся эти компоненты, тогда работал оставшийся вызов.

Это означало, что эти компоненты были созданы дважды, один раз для глобального контекста (поскольку он сканирует файл конфигурации, содержащий это сканирование для сервлета flex), и один для контекста rest-servlet (я проверил это с помощью простого статический счетчик и блокировка класса).

Мой вопрос: почему не может сервлет сервата увидеть бобов, которые может использовать flex-сервлет?

ответ

1

Хотя это правда, что сервлет может контекст приложение доступа бобы из ContextLoaderListener контекста приложения, эти бобы не будет проведены консультации при отображении HTTP вызовов к контроллерам. Все компоненты контроллера должны быть объявлены (или отсканированы) непосредственно в appcontext сервлета, иначе они будут проигнорированы.

Я предлагаю вам отделить записи точки входа REST (т. Е. @RequestMapping) от ваших BlazeDS. Например, возьмите свой класс UserService со своего другого поста: создайте класс UserController, поместите аннотации REST на него и делегируйте от UserController до UserService. UserController будет объявлен в контексте приложения сервлета и введен в UserService из контекста ContextLoaderListener.

+0

спасибо за объяснение. Можете ли вы сослаться на ресурс, определяющий это весеннее решение («эти бобы не будут обсуждаться при сопоставлении HTTP-вызовов с контроллерами»)? – Ittai

+0

@Ittai: Нет, не совсем. Это как раз то, как это работает, я не думаю, что в документации указано это явно. – skaffman

+0

Хорошо, спасибо большое. – Ittai

0

Вам нужно использовать контекст Spring Web и определить DispatcherServlet, который будет дочерним контекстом для одного, загруженного ContextLoaderListener.

Это DistresscherServlet, который должен загрузить ваш rest-servlet.xml, а не ContextLoaderListener. В противном случае ребята, которых вы называете «сервлетами» и которые, по сути, я полагаю, являются контроллерами, просто не получат запросы от вашего клиента.

Вы можете прочитать обо всем этом материал здесь: http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html

Это стандартный способ сделать веб-связанные вещи весной, и вы определенно должны следовать.

+1

Привет, почему, по-вашему, я не использую диспетчерскую люк?Я специально указал, что использую его. Буду признателен, если вы перечитаете мой вопрос, так как он указывает его там – Ittai

+0

@Ittai: извините. Я думаю, что «создать дополнительный сервлет обслуживания (типа DispatcherServlet)» перепутал меня ... Поскольку DispatcherServlet не является сервлетом REST. – weekens

+0

без проблем. Что вы подразумеваете под: «DispatcherServlet не является сервлетом REST»? Вы имеете в виду, что это просто «обычный» сервлет, и тогда я могу использовать его, но я хочу? (что я знаю) или в другом значении (например, есть сервлет с пружинным отдыхом)? – Ittai