RESTEasy не будет отображать мой bean-компонент Spring с настраиваемым Spring ContextLoader

  • RESTEasy 2.0.1GA
  • Java 1.6
  • Spring 3.0.3

Я пробовал все, что мог, но не могу понять, что происходит. У меня есть приложение Spring MVC, однако я бы хотел, чтобы некоторые конечные точки RESTEasy были доступны за пределами приложения Spring MVC, но в том же контейнере, что в конечном итоге позволяет подключаться к тем же bean-компонентам.

В качестве первого шага я просто пытаюсь установить RESTEasy внутри контейнера, обслуживая запросы от компонента, настроенного Spring. Я пробовал использовать шаблон из инструкций, а также попытался выполнить настройку вручную, но безрезультатно.

Bean

@Resource
@Path("/")
public class NeighborComparison {

    private String foo;

    @GET @Path(value="customer") @Produces("text/plain")
    public String getNeighborComparison() {
        return "foo";
    }
}

web.xml

<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/api</param-value>
</context-param>

<listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>

<!-- NOT configuring SpringContextLoaderListener because I declare my own, so if I do, everything
     blows up, plus  all it actually does is sanity check configuration -->
<listener>
    <listener-class>com.example.MyCustomContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

applicationContext. xml

<bean id="resteasy.providerFactory" class="org.jboss.resteasy.spi.ResteasyProviderFactory"
      factory-method="getInstance">
</bean>

<bean id="resteasy.dispatcher" class="org.jboss.resteasy.core.SynchronousDispatcher">
    <constructor-arg ref="resteasy.providerFactory"/>
</bean>

<bean id="resteasy.spring.bean.processor" class="org.jboss.resteasy.plugins.spring.SpringBeanProcessor">
    <description>
        Add Resources and @Providers to the appropriate places
        in Resteasy's infrastructure
    </description>
    <constructor-arg ref="resteasy.dispatcher"/>
</bean>

<bean id="neighborComparison" class="opower.api.customer.neighbor_comparison.NeighborComparison">
</bean>

Согласно документации, все, что мне нужно сделать, это «вручную зарегистрировать RESTeasy BeanFactoryPostProcessor, выделив экземпляр org.jboss.resteasy.plugins.spring.SpringBeanProcessor». Я считаю, что эта весенняя конфигурация делает это.

Jetty запускается, и контекст приложения вращается без проблем. Приложение работает нормально, однако, когда я

> curl -H"Accept: text/plain" localhost:8080/ei/api/customer

(«ei» - это контекст приложения). Журнал показывает (это и только это):

2011-03-29 16:44:24,153 DEBUG [qtp-575315405-0] [EI] [] [asy.core.SynchronousDispatcher] PathInfo: /customer
2011-03-29 16:44:24,156 DEBUG [qtp-575315405-0] [EI] [] [asy.core.SynchronousDispatcher] Failed executing GET /customer
org.jboss.resteasy.spi.NotFoundException: Could not find resource for relative : /customer of full path: http://localhost:8080/ei/api/customer

Даже если бы я смог убедить RESTEasy показать мне сопоставления, кажется, что он просто не обнаруживает мой bean-компонент.

Если я сопоставлю его явно с помощью resteasy. ресурсы параметр контекста, он работает, хотя явно не имеет доступа к автоматически подключаемым компонентам Spring.

Что-нибудь еще я могу попробовать? У меня есть журнал отладки всей кодовой базы RESTEasy, и я не получаю никаких сообщений. Я' Мы также подтвердили, что Spring на самом деле создает мой компонент, так что RESTEasy его просто не находит.

6
задан davetron5000 30 March 2011 в 17:53
поделиться