我创建了sigleton会话bean,它保持与我的mongo数据库的一个连接。当使用@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数据库中的loged用户角色。
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)) ;
}
}
答案 0 :(得分:0)
注入对于使用new
创建的对象不起作用,因为容器从未被赋予控制权以执行注入。我建议将@EJB
移动到过滤器并将其传递给MongoSecurityContext构造函数。