0

mongo データベースへの接続を 1 つ保持する sigleton セッション Bean を作成しました。@EJB アノテーションを使用すると、jax-rs クラスでうまく機能します。コントローラーが構築され、Bean が注入された後、@PostConstruct でアノテーションが付けられた init メソッドを呼び出します。

次に、SecurityContext を実装する同様のクラスを作成しました。コントローラと同じパターンを使用しましたが、正しく動作しません。init() メソッドは呼び出されず、EJB インスタンスは常に null です。

EJB を私の SecurityContext 実装に注入する方法はありますか? MongoConnection を注入して使用しようとしない限り、うまく機能します

mongo データベースに接続するために使用するシングルトン セッション Bean:

@Singleton
@Startup
public class MongoConnection {

@PostConstruct
public void init() {
    // initialize properties
}

JAX-RSコントローラーで使用します。ここで機能し、EntityController から継承されたクラスでも機能します。

Produces(MediaType.APPLICATION_JSON)
public class EntityController extends Application {

@Context
private UriInfo context;

**@EJB
protected MongoConnection connection;**

public EntityController() {

@PostConstruct
void init() {
    ...
    connection.getMongo();
    connection.getDatabaseName();
    ...
}
}

mongo データベースでログに記録されたユーザー ロールを検索する独自のセキュリティ コンテキストを実装しました。

public class MongoSecurityContext implements SecurityContext {

**@EJB
private MongoConnection connection;**


public MongoSecurityContext() {
}

@PostConstruct
void init() {
   ...
    connection.getMongo();
    connection.getDatabaseName();
    ...
}

public MongoSecurityContext(ContainerRequestContext requestContext) {
    token = requestContext.getHeaderString("token");
}

@Override
public boolean isUserInRole(String roleName) {
    //**connection is allways null**, so it returns false;
    if (connection == null)
        return false;
}
}

編集:

忘れましたが、glassfish 4 コンソールにも次の警告があります。

 A provider extremeteacher.mongo.connection.MongoConnectionEjb registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider extremeteacher.mongo.connection.MongoConnectionEjb will be ignored

EDIT2:

@Provider
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) {

        requestContext.setSecurityContext(new MongoSecurityContext(requestContext)) ;

    }    
}
4

1 に答える 1

0

newコンテナにはインジェクションを実行するための制御が与えられないため、で作成されたオブジェクトに対してインジェクションは機能しません。をフィルターに移動し@EJBて、MongoSecurityContext コンストラクターに渡すことをお勧めします。

于 2014-04-16T14:24:18.127 に答える