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

使用CDI时Rest服务将不工作:服务保持空

郑乐池
2023-03-14

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

所以现在我已经用一个假的DB(“CafeStub”)和一个使用JPA(“CafeDB”)的真实DB制作了我的域名“Cafes”。我的域名也稍微使用了CDI。(@Inject在CafeService类中…)

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

这是我的“咖啡控制器”课。生产Rest服务

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>

提前感谢...干杯汤姆

共有2个答案

须曜文
2023-03-14

解决了的。。RequestScoped成功了。。Daimn找了这么久才找到一条注释。

@RequestScoped
@Path("/cafes")
public class CafeController {

我仍然不明白为什么我需要使用它@RequestScoped:CDI实例化和管理bean-

赫连昕
2023-03-14

仅用@Path注释的类不会将该类标记为CDI bean,因为它不在CDI规范中bean定义注释的列表中。将请求范围添加到REST服务将其标记为CDI bean,因此注入工作就像您发现的那样。

这里的答案列出了将类标记为CDIBean的注释。是@javax。注释。ManagedBean是CDIBean定义的注释吗?

 类似资料:
  • 我正在寻找一个最佳实践和高效的解决方案,以确保通过REST与Web客户端应用程序通信的多个微服务的安全。 当前设置: 这些微服务是用Java制作的,带有Spring框架,并运行在Docker容器中。 客户端是一个Angular 2应用程序。 我创建了一个新的µ服务,它将充当“网关”,是我的web客户端和其他服务之间的唯一通信点。 我从远程身份验证API检索JWT加密令牌(让我们称之为LOCK) 我

  • 问题内容: 该问题在某种程度上与以下链接的问题有关。但是,我需要在某些方面和一些其他信息上多一点清晰度。 我需要使用令牌为REST Web服务实现安全性 该Web服务旨在与Java客户端一起使用。因此,表单身份验证和凭据弹出窗口没有用。 我是REST安全和加密的新手 这是我到目前为止所了解的: 对于第一个请求: 用户建立https连接(或容器使用301确保https) 用户POST输入用户名和密码

  • 如何使用Spring Boot保护REST服务(OAuth)? 我能得到的最接近的是:http://spring.io/guides/gs/securing-web/http://spring.io/guides/gs/authenticating-ldap/

  • 这个问题在某种程度上与下面的链接问题有关。然而,我需要在某些方面更多的澄清和一些额外的信息。参考:REST Web服务身份验证令牌实现 背景: null null 对于后续请求: 客户端发送此加密令牌和哈希组合(使用基本的用户名字段?) 我们使用哈希确保加密的令牌没有被篡改,然后对其解密 我们检查会话跟踪表中解密的令牌是否有未过期的条目,并获得实际的用户名(过期由代码管理?) 如果找到用户名,则根

  • 我想让IntentService在后台运行,即使应用程序被终止。但如果我从最近的屏幕上删除我的应用程序,我的服务就会停止。我怎样才能避免这种情况?换句话说,即使我的应用关闭了,最近的应用也无法运行,我该如何保持我的服务运行? 我的前台服务: 我的常数: 我的清单: 当应用程序打开时,我看到服务正在运行。当我通过home按钮最小化应用程序时,它仍在运行。当我通过后退按钮关闭应用程序时,它仍在运行。但

  • 我正按照文章中的说明,尝试使用keydepeat保护Spring BootREST服务https://medium.com/devops-dudes/securing-spring-boot-rest-apis-with-keycloak-1d760b2004e.我以docker服务的形式启动KeyClope和我的服务(docker compose.yml见下文) 然后,我首先 然后在将环境变量$