Jakarta ee InitialContext在Java EE over mappedName中有什么用途?

Jakarta ee InitialContext在Java EE over mappedName中有什么用途?,jakarta-ee,dependency-injection,ejb,initial-context,Jakarta Ee,Dependency Injection,Ejb,Initial Context,我不明白什么时候会有人用(new InitialContext()).lookup(..)而不是 @Stateless(mappedName="A1Global") public class A1 implements A { ... } @EJB(mappedName="A1Global") private A a; 使用mappedName的后一种方法有任何缺点吗?我还注意到JNDI名称可能是特定于供应商的、复杂的、不必要的长。通过JNDI抓取EJB在不受依赖项注入容器管理的类中可能很有

我不明白什么时候会有人用
(new InitialContext()).lookup(..)
而不是

@Stateless(mappedName="A1Global")
public class A1 implements A { ... }

@EJB(mappedName="A1Global")
private A a;

使用mappedName的后一种方法有任何缺点吗?我还注意到JNDI名称可能是特定于供应商的、复杂的、不必要的长。

通过JNDI抓取EJB在不受依赖项注入容器管理的类中可能很有用,因此,
@EJB
根本不起作用。然而,这些都是罕见的情况,通常是由于与您希望使用
@EJB
的客户机框架相关的规范中的错误或疏忽造成的,并且应该在该客户机框架的较新版本中报告、讨论和解决,以便最终只使用
@EJB

例如,JavaEE的MVC框架JSF支持自定义转换器和验证器。但是,由于疏忽,
@EJB
在自定义JSF
转换器
验证器
中不受支持,而它们有时可能需要调用业务服务调用。这在JSF2.3中得到了解决,但在此之前,一个解决方法是通过JNDI获取EJB——虽然这相当笨拙,但还有更简单的解决方法,请参见a.o

Bean验证(JavaEE的验证框架)也是如此。在1.1版之前,自定义
约束验证程序中不支持
@EJB
。另见a.o

如果EJB不是特定于供应商的,则使用JNDI名称。至少,JavaEE中并没有这样规定。但是,它特定于EJB的打包方式以及EJB客户机在应用程序中的位置。这个相关问题的答案解释了JNDI名称是如何组成的,以及根据EJB客户端的位置应该使用哪个JNDI名称:

简而言之,如果您可以使用
@EJB
,那么请务必使用它。如果你做不到,那么首先研究一下你是否以正确的方式做事。有时,人们试图在一个完全没有意义的地方获取EJB。如果您可以确认您不是唯一一个在使用
@EJB
以实现所需功能需求时遇到问题的人,那么请向相关的客户机框架报告一个问题。他们很可能会在指定的位置添加
@EJB
支持

也就是说,如果您的环境支持CDI,那么您需要知道,现在建议将
@EJB
迁移到
@Inject
。在JavaEE6/7中,除了一种特殊情况(EJB在自身中的循环注入)之外,它可以很好地工作。CDI的目的是将整个JavaEE框架中的所有各种依赖注入机制统一到一个API中。例如,JSF已经计划在未来的JavaEE版本中弃用其
@ManagedBean
/
@ManagedProperty
,而支持
@Named
/
@Inject
。另请参见a.o.
@EJB
也可能发生同样的情况,以支持
@Inject