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

时间:2013-03-16 18:58:42

标签: java-ee jax-rs cdi

我已经创建了JAX-RS服务,我想在其中注入一个应用程序范围的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;
    }

}

3 个答案:

答案 0 :(得分:5)

您需要将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();
    }
}

编辑:确保WEB-INF文件夹中有 beans.xml 文件。您的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>

编辑:根据this JIRA,您可以将@RequestScoped替换为@ManagedBean

答案 1 :(得分:0)

内置的上下文对象在servlet,Web服务和EJB调用期间是活动的,或者在会话上下文对象的情况下,对于JSF请求是活动的。

您可能无法从JAX-RS服务访问请求,范围和应用程序bean,因为它没有明确说明对此的支持,但在您的情况下,您似乎只需要一个单例而不是基于上下文的bean。

如果您使用CDI(beans.xml)

,请保持这样
@Singleton
public class GameController {
    private Game game;
    public GameController() {
        this.game = new Game(new ArrayList<Room>());
    }
....
}

如果您使用带有Spring的CDI(没有beans.xml),请保留@Named

@Named
@Singleton
public class GameController {
    private Game game;
    public GameController() {
        this.game = new Game(new ArrayList<Room>());
    }
....
}

如果以上操作不起作用,那么我建议将您的JAX-RS服务标记为@ManagedBean以及上述更改,因为不清楚CDI是否管理JAX-RS服务。

答案 2 :(得分:-1)

cdi-api.jar添加到您的项目中。