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