0

我创建了 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)) ;

    }    
}
4

1 回答 1

0

注入不适用于创建的对象,new因为容器从未获得执行注入的控制权。我建议将@EJB移至过滤器并将其传递给 MongoSecurityContext 构造函数。

于 2014-04-16T14:24:18.127 回答