jersey-spring3 Bridge没有找到我的资源

时间:2013-12-30 23:36:35

标签: java spring jersey-2.0

我正在使用Jersey / Spring桥(https://jersey.java.net/documentation/latest/spring.html)而我无法通过Spring XML配置文件查看我的Jersey资源。

(Spring 3.2,Jersey 2.5,jersey-spring3 2.5,jackson-jaxrs-json-provider 2.2.3。)

在我的Spring配置文件中,我有

<context:component-scan base-package="com.fasterxml.jackson.jaxrs.json, com.mycompany.mappers, com.mycompany.resources" />

SpringComponentProvider.initialize()成功,并且SpringComponentProvider.bind被调用了一堆类(好吧,实际上只是Jersey服务器的WADL包中的东西),但被调用我的资源类。

我可以看到Spring正在寻找我的资源:

2013-12-30 16:47:24,246 [main]  org.springframework.beans.factory.support.DefaultSingletonBeanRegistry:215  DEBUG   Creating shared instance of singleton bean 'myResource'
2013-12-30 16:47:24,246 [main]  org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory:432    DEBUG   Creating instance of bean 'myResource'

docs(https://github.com/jersey/jersey/tree/2.5/examples/helloworld-spring-webapp)中引用的示例应用程序定义了org.glassfish.jersey.server.ResourceConfig的Jersey应用程序子类,并以编程方式注册资源。我希望使用Spring XML配置文件绑定资源,而不是硬编码。 (这曾经在泽西岛1.x工作。)

如何让Jersey 2识别我的资源?

1 个答案:

答案 0 :(得分:1)

我会回答我自己的问题。

答案是Jersey 2的Spring桥不支持<context:component-scan .../>,您必须以编程方式注册资源。

查看Jersey / Spring文档(https://jersey.java.net/documentation/latest/spring.html)并完全按照Spring示例应用程序(https://github.com/jersey/jersey/tree/master/examples/helloworld-spring-webapp)...如果您退出该路径,那么它将无效。< / p>

关键部分是像这样继承ResourceConfig(例如https://github.com/jersey/jersey/blob/master/examples/helloworld-spring-webapp/src/main/java/org/glassfish/jersey/examples/helloworld/spring/MyApplication.java):

public class MyApplication extends ResourceConfig {

    public MyApplication () {
        register(MyRequestContextFilter.class);
        register(MyResource.class);
        packages("com.mycompany.resources");
        ...
    }
}

然后使用javax.ws.rs.Application(例如https://github.com/jersey/jersey/blob/master/examples/helloworld-spring-webapp/src/main/webapp/WEB-INF/web.xml)在您的应用描述符中命名您的子类:

<servlet>
    <servlet-name>SpringApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.glassfish.jersey.examples.helloworld.spring.MyApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>