自动装配Spring 3.2和Jersey 2.4的问题

时间:2013-11-08 13:52:10

标签: java spring jersey

我正在尝试将使用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有问题。

有人有什么想法吗?感谢。

1 个答案:

答案 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>

请参阅https://jersey.java.net/documentation/latest/spring.html