我创建了 sigleton 会话 bean,它与我的 mongo 数据库保持一个连接。使用 @EJB 注释时,它在 jax-rs 类中运行良好 - 在构造控制器并注入 bean 后,它调用带有 @PostConstruct 注释的 init 方法。
然后我创建了类似的类,它正在实现SecurityContext。我使用了与控制器中相同的模式,但它无法正常工作。永远不会调用 init() 方法,并且 EJB 实例始终为空。
那么有没有办法将 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
编辑2:
@Provider
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) {
requestContext.setSecurityContext(new MongoSecurityContext(requestContext)) ;
}
}