使用Context在多个EJB之间共享数据

时间:2014-02-19 16:15:27

标签: java-ee glassfish ejb ejb-3.1 glassfish-4

使用Glassfish领域和Context我可以使用UserPrincipal.getName()isUserInRole方法检索有关登录用户的信息。

但是,我需要在EJB之间共享更多数据,例如:有关我可以通过数据库或LDAP获取的用户的信息(例如名称,域等)。

我不是在询问如何检索这些信息,但我花了好几个小时才找到一种好方法将它传递到会话/请求中调用的所有EJB。 我已经阅读了EJBContext.getContextData(),但似乎这个属性没有被传播,我不能使用存储它们的EJB之外的存储值。我还阅读了关于实现我自己的UserPrincipal的内容,但是我不知道如何为Glassfish做这个,并继续使用glassfish默认领域配置。

我不想修改我的EJB签名来传递信息,但我想不出另一种正确的方法。

你有什么想法吗?

3 个答案:

答案 0 :(得分:2)

由于您正在使用Glassfish,您可以使用JASPIC,它是跨层传递凭证数据的Java EE标准。编写JASPIC适配器本身并不太难,它通常是一个简单的层,除非您像我一样实现OpenID Connect身份验证,因为您通常只使用JAVA EE7 API提供的内容而不是其他支持库。

答案 1 :(得分:0)

乍一看,没有查看你的代码,也许你可以使用拦截器,你的要求听起来像AOP(你可以在拦截器中注入资源,如SessionContext)。所以,你在执行方法之前和之后都会抓住方法并做一些魔术。

如果这还不够,我想到的另一个想法就是使用CDI生成器,你创建了一个方法,用你需要的信息生成一个Object,在某些时候你可以将它作为依赖项注入你的EJB:

例如:http://java.dzone.com/articles/cdi-di-p1

答案 2 :(得分:-1)

这实际上是不可能的。如果您只使用本地调用,则可以使用ThreadLocal,但请确保在调用完成时将其删除,以避免在池化线程上泄漏内存。如果你正在使用远程,我不知道任何其他解决方案,除了修改方法签名。