java - 使用 CDI : Service stays null 时休息服务将无法工作

标签 java jakarta-ee jax-rs cdi

我正在使用 JAX-RS 制作休息服务应用程序。它用于学校的一些项目。对于这个项目,我需要使用以下技术: • Maven • JAX-RS • CDI • JPA - EJB • JNDI • Bean 验证

所以现在我已经使用假数据库(“CafeStub”)和使用 JPA 的真实数据库(“CafeDB”)创建了我的域“Cafes”。我的域也使用了一些 CDI。 (@Inject 在 CafeService 类中...)

否,我想使用 JAX-RS 创建我的休息服务。这工作得很好: enter image description here

我的问题是,当我尝试再次使用 CDI 时,它失败并给出 500 异常、NullPointerException、“严重:无法将 RuntimeException 映射到响应,重新抛出到 HTTP 容器” 完整的堆栈跟踪: enter image description here

我不知道如何解决这个问题,已经搜索了很长时间..希望有人可以帮助我:s

这是我的“CafeController”类(class)。生产剩余服务

Path("/cafes")
public class CafeController {

@Inject
private CafeFacade cafeFacade;

public CafeController() {
   //this.cafeFacade = new CafeService();
}

@GET
@Produces("application/json")
public Response getCafes(){
    try{
        // test ........ 
        ObjectMapper mapper = new ObjectMapper();
        Cafe cafe = cafeFacade.getCafe(new Long(1));
        String jsonInString = mapper.writeValueAsString(cafe);
        return Response.status(200).entity(jsonInString).build();
    }catch (JsonProcessingException jsonEx) {
        System.out.println("Json Exception");
        System.out.println(jsonEx.getMessage());
        return null;
    }
}

这个类是“CafeService”类,它实现了“CafeFacade”

public class CafeService implements CafeFacade {

@Inject
private CafeRepository cafeRepository;

public CafeService() {
    //cafeRepository = new CafeStub();
    //cafeRepository = new CafeDB("CafesPU");
}

@Override
public long addCafe(Cafe cafe) {
    return this.cafeRepository.addCafe(cafe);
}

@Override
public Cafe getCafe(long cafeID) {
    return this.cafeRepository.getCafe(cafeID);
}

你会看到“CafeStub”类,它实现了“CafeRepository”

public class CafeStub implements CafeRepository {

private static Map<Long, Cafe> cafes;
private static long counter = 0;

public CafeStub() {
    cafes = new HashMap<Long, Cafe>();

    // adding some dara
    this.addSomeData();
}    

@Override
public long addCafe(Cafe cafe) {
    if(cafe == null){
        throw new DBException("No cafe given");
    }
    counter++;
    cafe.setCafeID(counter);
    cafes.put(cafe.getCafeID(), cafe);
    return cafe.getCafeID();
}

@Override
public Cafe getCafe(long cafeID) {
    if(cafeID < 0){
        throw new DBException("No correct cafeID given");
    }
    if(!cafes.containsKey(cafeID)){
        throw new DBException("No cafe was found");
    }
    return cafes.get(cafeID);
}

至少在这里你可以看到我的pom.xml(来自CafeService项目的依赖项)-web.xml(来自CafeService项目)和项目结构...

<dependencies>
    <dependency>
        <groupId>Cafes</groupId>
        <artifactId>Cafes</artifactId>
        <version>0.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.3</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
    </dependency>    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.19.4</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.19.4</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.19.4</version>
    </dependency>
</dependencies>

enter image description here

enter image description here

提前致谢... 干杯 汤姆

最佳答案

仅使用 @Path 注解的类不会将该类标记为 CDI bean,因为它不在 CDI 规范中的 bean 定义注解列表中。将 RequestScoped 添加到 REST 服务将其标记为 CDI bean,因此注入(inject)可以像您发现的那样工作。

这里的答案列出了将类标记为 CDI bean 的注释。 Is @javax.annotation.ManagedBean a CDI bean defining annotation?

关于java - 使用 CDI : Service stays null 时休息服务将无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45547389/

相关文章:

java - 控制 zip 存档中文件的排序顺序

Windows 10 上启动 Elasticsearch 时的 Java 问题

java - CDI.current().select().get() 和 BeanManager.getReference() 在功能上是否等效?

java - Hibernate 'Cannot Release Connection' 异常?

java - 我的第一次登录尝试没有给我任何消息

java - 检查 EasyMock 上是否调用了方法

java - Tomcat 中的严格引号转义

java - 如何在 Jersey 中的MessageBodyWriter的writeTo方法中获取注释值?

java - 从 JAX-RS 服务发送重定向

java - 使用 DropWizard 对 JAX-RS 端点执行单元测试时无法挂起异步请求的连接