我有一个同时使用 Spring 和 Jersey 的 Servlet 3.0 Web 应用程序。我目前使用在 web.xml 中配置为过滤器的 SpringServlet 进行设置,并且资源类同时使用@Path
和@Component
. 这是 web.xml 片段:
<filter>
<filter-name>jersey-serlvet</filter-name>
<filter-class>
com.sun.jersey.spi.spring.container.servlet.SpringServlet
</filter-class>
<init-param>
<param-name>
com.sun.jersey.config.property.packages
</param-name>
<param-value>com.foo;com.bar</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jersey-serlvet</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
此设置有效,但我真的想仅使用注释进行设置 - 没有 web.xml 配置。我的第一次尝试是删除上面的 SpringServlet 配置并创建一个扩展类Application
。这是其中的一个片段:
@ApplicationPath("/*")
public class MyApplication extends PackagesResourceConfig {
public MyApplication() {
super("com.foo;com.bar");
HashMap<String, Object> settings = new HashMap<String, Object>(1);
settings.put(ServletContainer.FEATURE_FILTER_FORWARD_ON_404, true);
this.setPropertiesAndFeatures(settings);
}
}
这是因为 JAX-RS 资源已注册,我可以在它们的 URL 上点击它们,但是当它们尝试使用它们的自动装配属性时会抛出 NullPointerExceptions ......这是有道理的,因为我猜测资源现在正在被加载Jersey 并且不是 Spring 管理的 bean,因此没有自动装配。
尽管进行了相当多的搜索,但我找不到任何将 Jersey 资源加载为仅带有注释的 Spring bean 的方法。 有没有这样的方法? 我真的不想为资源编写一堆代码来手动获取 Spring 上下文并在我可以帮助的情况下调用 DI。
Application
如果仅注释不起作用,那么如果我可以指定要加载的类而不是要扫描的包列表,那么我可以使用 web.xml 中的过滤器配置。如果我可以摆脱那里的包列表并只指定一个Application
类实例,那么我会很满足。
显然,如果有人对我有明确的答案,那就太好了,但我也很感激任何关于我可以在哪里寻找或尝试的东西的指针或提示。
谢谢,马特