gpt4 book ai didi

java - EJB 的类名

转载 作者:行者123 更新时间:2023-11-30 04:58:37 31 4
gpt4 key购买 nike

我有一些类似这样的代码:

@EJB
protected SomeService service;

// Somewhere in a method
service.getClass().getSimpleName();

我正在寻找的是 EJB 类的名称,在本例中应该是类似于 SomeServiceBean 的名称。然而,我得到的是例如 $Proxy2128

有没有办法可以获取我实现的实际 EJB 类的名称,而不是代理类的名称?

认为我们正在将 ejb 3.0 与 geronimo 或类似的东西一起使用。

最佳答案

这样做可能不是一个好主意。我怀疑你最好做一些事情,比如向 bean 添加一个方法,该方法返回一个在你控制之下的类型字符串。最简单的此类实现

public String getSimpleClassName() {
return getClass().getSimpleName();
}

这在代理中是安全的。面对动态子类化并不安全,但我不知道有任何 EJB 实现可以做到这一点(尽管肯定有 JPA 实现可以做到这一点)。

稍微复杂一点,但基本上更简单的实现是定义:

public abstract String getSimpleClassName();

在基类(或接口(interface))中,然后编写:

public String getSimpleClassName() {
return SomeService.class.getSimpleName();
}

在某些服务中。这是铸铁保证可以工作的。

或者,如果您正在使用无界面 View ,并且不介意反射以及系统随时起火的风险,那么在调用代码中,您可以执行以下操作:

private String findBeanClassName(Object beanRef) {
return findBeanClass(beanRef).getSimpleName();
}

private Class<?> findBeanClass(Object beanRef) {
return findAncestorWithAnnotation(beanRef.getClass(), Stateless.class);
}

private Class<?> findAncestorWithAnnotation(Class<?> cl, Class<? extends Annotation> annotation) {
while ((cl != null) && !cl.isAnnotationPresent(annotation)) {
cl = cl.getSuperclass();
}
return cl;
}

这应该有效。显然,如果您使用有状态 bean,则需要使用不同的注释类。

关于java - EJB 的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7685715/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com