我正在使用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识别我的资源?
答案 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>