EJB的类名

时间:2011-10-07 10:01:14

标签: java ejb

我有一些代码:

@EJB
protected SomeService service;

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

我正在寻找的是EJB类的名称,在这种情况下应该是SomeServiceBean的行。但是,我得到的是例如$Proxy2128

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

稍微复杂但实质上更直接的实现是定义:

public abstract String getSimpleClassName();

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

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

在SomeService中。这是铸铁保证有效。

或者,如果您正在使用无界面视图,并且不介意反思,并且系统随时都会冒着火焰的风险,那么在调用代码中,您可以执行以下操作:

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,则需要使用不同的注释类。