我正在尝试将使用Spring 3.2和Jersey的系统从Jersey版本1.17升级到Jersey版本2.4。我遇到了一个恼人的问题@Autowired,其中Jersey基本上抱怨它找不到给定(通用)类型的bean。
我们有一个基类(BaseService<T>
)用于数据库支持的服务,它提供基本的CRUD样式接口(获取,保存,删除)。我们还有一个REST资源的基类,看起来类似于:
public abstract class BaseResource<S extends BaseService<T>>
{
protected S service;
// ... common functions used by BaseService descendants ...
@Autowired
public void setBaseService(S baseService)
{
this.service = baseService;
}
}
然后我们有许多继承自BaseResource
的具体类,提供它们独特的逻辑等。在Jersey 1.17下,这样可以正常工作。
将环境升级到Jersey 2.4并包含jersey-spring3项目后,我得到了不同的行为。在服务启动期间,我可以验证Spring调用setBaseService()
例程,并且提供的参数不为null。但是,当客户端进行调用并执行实际的REST资源时,Jersey会记录以下警告
org.glassfish.jersey.server.spring.AutowiredInjectResolver getBeanFromSpringContext
WARNING: No beans found. Resolution failed for type S.
这实际上导致Jersey将空参数传递给setBaseService()
例程,这当然会导致NPE。现在我可以通过检查解决null参数,但我想知道为什么Jersey遇到这个问题以及如何避免它。
有趣的是,我有另一个REST资源,它不会从BaseResource
继承而是包含自己的@Autowired
setService()
例程。这个很好用; Spring在启动时正确调用它,并且在每次调用时由Jersey使用非null参数正确调用。它只是基于泛型的setter有问题。
有人有什么想法吗?感谢。
答案 0 :(得分:0)
请尝试以下方法。 添加以下依赖项:jersey-spring3 上面允许Spring DI支持使用spring xml进入JAX-RS类。 如果您使用的是Maven,请将以下内容添加到您的pom中。
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>`
<artifactId>jersey-spring3</artifactId>`
<version>2.4.1</version>
<scope>runtime</scope>
</dependency>