6

アプリケーション スコープの Bean を挿入する JAX-RS サービスを作成しました。問題は、豆が注入されていないことです。これはどのように発生し、どうすれば解決できますか?

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

}
4

3 に答える 3

7

Bean をインジェクションの対象にするには、Bean を管理対象リソースにする必要があります。最低限、@RequestScopedJAX-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>

編集:この JIRAに基づいて、次のように置き換えることができ@RequestScopedます@ManagedBean

于 2013-03-16T22:27:50.950 に答える
1

組み込みのコンテキスト オブジェクトは、サーブレット、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>());
    }
....
}

上記が機能しない場合は@ManagedBean、CDI が JAX-RS サービスを管理しているかどうかが不明であるため、上記の変更とともに JAX-RS サービスをマークすることをお勧めします。

于 2013-03-20T02:45:06.363 に答える