【问题标题】:Jersey and spring integration - bean Injections are null at runtimeJersey 和 spring 集成 - bean Injections 在运行时为空
【发布时间】:2011-07-13 00:07:45
【问题描述】:

我正在尝试将服务注入到使用 Jersey 的 Rest 类中。

无论我尝试注入什么或如何尝试注入此类,在运行时似乎都显示为 null。查看日志文件显示在初始化 Web 应用程序时正在调用 setJsonTestService,并且此时它不为空。但是,稍后通过对此类的 PUT 请求访问它时,它为空。

我完全糊涂了。

类如下所示:

@Named
@Path("JsonTest")
public class JsonTest {
    @Context
    Request request;
    @Context
    UriInfo uriInfo;

    protected final Logger log = Logger.getLogger(getClass());

    private JsonTestService jsonTestService;

    @Autowired
    public void setJsonTestSerivce(JsonTestService jsonTestService) {
        log.info("Setting JsonTestService.");
        if (jsonTestService == null) {
            log.info("JsonTestService is null at injection");
        }
        this.jsonTestService = jsonTestService;
    }

    @Inject
    public ScrapIntermediate scrapIntermediate; // just a plain empty class with an is true method

    @PUT
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public void putJson(@PathParam("id") String id) {
        log.info("Putting some json at " + id);
        if (scrapIntermediate == null) {
            log.info("scrapIntermediate is null...");
        }
        if (jsonTestService != null) {
            jsonTestService.sendUpdate();
        } else {
            log.info("jsonTestService is null...");
        }
    } 
}

有什么想法吗?

更新:

web.xml(泽西岛)

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>EDAS</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

【问题讨论】:

  • Web 请求是如何映射到这个 Jersey 类的?听起来 Spring 实例化了此类的一个实例,但 Jersey 实例化了另一个实例以用于处理请求。
  • 我已更新问题以显示我的 web.xml 的泽西岛部分。那是我唯一提到泽西岛的其他地方。
  • 并解决了。 Maven 和我的 Jersey 导入的问题导致 spring-context 2.5.6 和 3.0.5 都被导入。这导致了注解冲突,并导致同一类的不同实例化。一旦它允许我将其发布为答案......谢谢你的洞察力马特。

标签: java spring dependency-injection annotations jersey


【解决方案1】:

试试

<servlet-class>
     com.sun.jersey.spi.spring.container.servlet.SpringServlet
</servlet-class>

您还需要contextConfigLocation &lt;context-param&gt;,但我假设您拥有它。 See here 了解更多设置详情

正如 matt b 建议的那样,spring 会实例化您的对象,但 Jersey 对 spring 一无所知并再次实例化它们。当您使用SpringServlet 时,它应该定位到spring 应用程序上下文。

也就是说,spring-mvc 提供了与 JAX-RS 非常相似的 RESTful 服务支持。你也可以试试。

【讨论】:

  • 是的,我一直在玩这个,最终在让它工作时使用了它。如果没有适当的 Maven 排除项,它不会让我这样做。
猜你喜欢
  • 2016-08-08
  • 2012-01-02
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2015-01-06
相关资源
最近更新 更多