我创建了 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(使用前将#替换为@)