1

我正在尝试将使用 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 在每次调用时使用非空参数正确调用。只是基于泛型的设置器有问题。

有人有想法么?谢谢。

4

1 回答 1

0

请尝试以下方法。添加以下依赖项: jersey-spring3 上面允许 Spring DI 支持到带有 spring xml 的 JAX-RS 类。如果您使用的是 Maven,请将以下内容添加到您的 pom.xml 中。

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>`
    <artifactId>jersey-spring3</artifactId>`
    <version>2.4.1</version>
    <scope>runtime</scope>
</dependency>

https://jersey.java.net/documentation/latest/spring.html

于 2013-12-13T10:39:00.467 回答