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

Posted

技术标签:

【中文标题】会话上下文中的 ejb 始终为空【英文标题】:ejb in session context is allways null 【发布时间】:2014-04-15 00:39:59 【问题描述】:

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

        

【问题讨论】:

MongoSecurityContext 是一个什么样的对象?它是如何创建的?只有容器创建的 EE 对象(不是通过new)才有资格注入。 嗨,感谢您的评论。我提出了更多的代码问题。我有一个 ContainerRequestFilter,它将我的安全上下文设置为所有请求的上下文。 【参考方案1】:

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

【讨论】:

再次感谢。我相信你有好的观点。但现在该过滤器中出现了同样的问题。我已将@EJB MongoConnection 添加到过滤器中,它始终为空。你不知道 glassfish 控制台中的这个警告是什么意思吗? A provider extremeteacher.mongo.connection.MongoConnection 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.MongoConnection will be ignored. 对不起,我看错了,以为是 servlet 过滤器。这听起来有点像 CDI 错误,但我不确定,也不知道问题可能出在哪里。 好吧,我想你已经很好地回答了我的问题,现在我有不同的问题。所以我接受了你的回答

以上是关于会话上下文中的 ejb 始终为空的主要内容,如果未能解决你的问题,请参考以下文章

阿波罗空上下文

错误:试图在空上下文对象上调用方法“格式”

在 android 中使用 Telr 支付网关时上下文为空

从 JPA/EJB3 持久性上下文中分离实体

EJB Timer Service不可用,上下文取消部署失败

无法在阿波罗服务器上下文中获取会话?