无法在 JAX-RS 服务中注入 @ApplicationScoped bean

2024-04-15

我创建了 JAX-RS 服务,我想在其中注入应用程序范围的 bean。问题是bean没有被注入。这是如何引起的以及如何解决?

JAX-RS 服务:

@Path("room")
public class RoomService {

    @Inject
    GameController gc;

    public RoomService() {}

    @Path("create")
    @GET
    @Produces("application/json")
    public String create() {
        Room r = new Room();
        gc.addRoom(r); // gc is null
        return r.toJson();
    }
}

应用程序作用域 bean

import java.util.ArrayList;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import pepuch.multuplayergameserver.entity.Game;
import pepuch.multuplayergameserver.entity.Room;

@Named
@ApplicationScoped
public class GameController {

    private Game game;

    public GameController() {
        this.game = new Game(new ArrayList<Room>());
    }

    public boolean addRoom(Room room) {
        if (!game.getRooms().contains(room)) {
            return game.getRooms().add(room);
        }

        return false;
    }

}

您需要使 bean 成为托管资源才能使其符合注入条件。至少添加@RequestScoped到 JAX-RS SIB 以使其具有注入价值。

另一种替代注释是@ManagedBean。关键是,如果父 bean 不在托管上下文中,Jersey 将无法解决所需的注入目标

import javax.enterprise.context.RequestScoped

@RequestScoped
@Path("room")
public class RoomService {

    @Inject
    GameController gc;

    public RoomService() {}

    @Path("create")
    @GET
    @Produces("application/json")
    public String create() {
        Room r = new Room();
        gc.addRoom(r); // gc is null
        return r.toJson();
    }
}

编辑:一定要有一个beans.xml文件位于 WEB-INF 文件夹中。您的 beans.xml 文件将类似于:

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

编辑:基于这个吉拉 http://java.net/jira/browse/GLASSFISH-18793,你可以替换@RequestScoped with @ManagedBean

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 JAX-RS 服务中注入 @ApplicationScoped bean 的相关文章

随机推荐