会话上下文中的ejb始终为null

时间:2014-04-15 00:39:59

标签: jax-rs ejb-3.1 java-ee-7 security-context

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

    }    
}

1 个答案:

答案 0 :(得分:0)

注入对于使用new创建的对象不起作用,因为容器从未被赋予控制权以执行注入。我建议将@EJB移动到过滤器并将其传递给MongoSecurityContext构造函数。