我正在尝试将使用 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 项目后,我得到了不同的行为。在服务启动期间,我可以验证setBaseService()
例程是否被 Spring 调用并且提供的参数不为空。但是,当客户端进行调用并执行实际的 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 在每次调用时使用非空参数正确调用。只是基于泛型的设置器有问题。
有人有想法么?谢谢。