当前位置: 首页 > 知识库问答 >
问题:

@Inject在JAX-RS资源中不起作用[重复]

干茂才
2023-03-14

我在尝试用@Inject搭配JAX-RS。我的问题是@Inject只在Servlets中有效。在JAX资源中,我得到一个空指针,我不知道我做错了什么。我的代码如下所示:

Pom.xml文件

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.8</version>
    </dependency>

    <dependency>
        <!-- JBoss/Weld Refrence Implementation for CDI on a Servlet Container -->
        <groupId>org.jboss.weld.servlet</groupId>
        <artifactId>weld-servlet</artifactId>
        <version>2.3.4.Final</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <!-- Provided by Tomcat, but needed for compilation -->
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- Twitter API -->
    <dependency>
        <groupId>org.twitter4j</groupId>
        <artifactId>twitter4j-core</artifactId>
        <version>4.0.4</version>
    </dependency>

    <dependency>
        <groupId>org.twitter4j</groupId>
        <artifactId>twitter4j-stream</artifactId>
        <version>4.0.4</version>
    </dependency>

    <!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.7</version>
    </dependency>

    <!-- Tests -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.9</version>
    </dependency>

</dependencies>

豆类.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
  http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>`

网页.xml包含:

<代码>

工人阶级:

package com.tinf15B2.webengeneering.boundary;

import javax.inject.Inject;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import com.tinf15B2.webengeneering.facade.Control;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class StartUpService implements ServletContextListener {

@Inject
private Control serviceController;

@Override
public void contextDestroyed(ServletContextEvent arg0) {
    serviceController.stopTweetListener();
    log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Service was closed");
}

@Override
public void contextInitialized(ServletContextEvent arg0) {
    serviceController.startTweetListener();
    log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Service started");
}
}

服务控制器。startTweetListener()和serviceController。stopTweetListener()工作。没有空指针。

非工人阶级:

import java.util.Date;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import com.tinf15B2.webengeneering.facade.Control;

@Path("/")
public class HashTagStatistic {

    @Inject
    private Control serviceController;

    @GET
    @Produces("text/html")
    public Response getStartingPage()
    {
        String output = "<h1>Hello World!<h1>" +
                "<p>RESTful Service is running ... <br>Ping @ " + new Date().toString() + "</p<br>";
        return Response.status(200).entity(output).build();
    }   

    @Path("resources/hashtagstatistic")
    @GET
    @Produces("text/html")
    public Response getHashTagStatisticAsHtml(){
        return Response //
                .status(200) //
                .entity(serviceController.getDatabaseContent()) //
                .build();
    }
}

但是当我尝试在此类中调用服务控制器.getDatabase内容()时,我得到了一个空点。

错误日志:

java.lang.NullPointerException
    com.tinf15B2.webengeneering.boundary.HashTagStatistic.getHashTagStatisticAsHtml(HashTagStatistic.java:33)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我不知道出了什么问题。如果有人有解决办法,那就太棒了=)

谢谢大家!

共有1个答案

东郭自强
2023-03-14

您的HashTagStatistic是JAX-RS资源。JAX-RS资源有自己的生命周期,由JAX-RS实现本身处理,CDI不属于这个生命周期。然而,许多JAX-RS实现提供了可以启用的CDI/JAX-RS桥。

您似乎正在使用泽西岛 1 作为 JAX-RS 实现,因此这应该对您有所帮助:https://stackoverflow.com/a/22995780/2492865

如果您正在考虑升级到泽西岛2,请阅读以下文档:https://jersey.java.net/documentation/latest/cdi.support.html

 类似资料:
  • 问题内容: 我一直在尝试使用NetBeans Ide创建一个简单的Restful WebService。 我的Java EE版本是:Java EE 7 Web。 我创建了一个新的Java Web应用程序,设置此ContexPath: 。 现在,运行我的应用程序,浏览器在以下位置显示我的页面: 因此,一切正常。 然后,我尝试使用RESTful Web服务向导创建一个简单的Restful资源。 因此,

  • 我正在尝试使用JAX-RS(泽西岛)创建一个简单的REST服务,而不使用Spring。我想要有典型的结构:资源,使用服务(典型接口与方法,查找全部...),并且该服务注入到资源中。 似乎CDI会自动扫描豆子并注入它们(在项目中有一个空),但是......它不适合我。 这是我的资源类: 这是我的服务及其impl类(这是一个模拟...): 我在这个类中使用了“无web.xml”配置: 我发现的唯一解决

  • 我试图在JBoss AS 7.1下部署一个简单的web应用程序,该应用程序与Resteasy捆绑在一起。根据文档,只需要(至少)一个空的、一个带有注释的和其他类的的类 下面是我所遵循的文档: https://docs.jboss.org/author/display/as7/jax-rs+reference+guide https://docs.jboss.org/author/display/a

  • 我创建了一个原型为maven archetype webapp的maven项目,然后为了将我的应用程序公开为rest webservice,我正在使用RestEasy,但是在rest应用程序中实现后,我无法访问我创建的URL。请告诉我我做错了什么。感谢您阅读此问题。 我的UserManagementController如下: 我的MyRestWS. java如下: 我的网站。xml如下: 该应用程

  • 我试图在构建时使用maven资源插件复制xml文件,但到目前为止没有成功。 Maven目标-干净安装 它需要任何特殊的maven目标来复制东西吗?请帮帮我。 插件版本 提到这个

  • 本章呈现 JAX-RS 核心概念-资源和子资源的概述。 JAX-RS 2.0 的 JavaDoc 文档 可以在这里 找到。 JAX-RS 2.0 规范草案可以在这里 找到。