java EJB的类名

wdebmtf2  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(135)

我有一些代码沿着大致如下:

@EJB
protected SomeService service;

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

我所寻找的是EJB类的名称,在本例中应该是沿着SomeServiceBean这样的名称,但我得到的却是$Proxy2128
有没有一种方法可以获得我实现的实际EJB类的名称,而不是代理类的名称?

  • 我们使用的是带geronimo的ejb3.0或类似的东西 *
6rqinv9w

6rqinv9w1#

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

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

这在代理中是安全的,在动态子类化中是不安全的,但是我不知道有任何EJB实现这样做(尽管肯定有JPA实现这样做)。
稍微复杂但基本上更直接的实现是定义:

public abstract String getSimpleClassName();

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

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

在某些服务中。这是保证工作的铸铁。
或者,如果您使用的是无接口视图,并且不介意反射,也不介意系统在任何时候爆发的风险,那么在调用代码中,您可以执行以下操作:

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

sg3maiej

sg3maiej2#

我不知道这是否适用于您的情况,但我遇到过类似的情况,我有一个拦截器来自动记录方法调用,我需要记录完整的类名,但通过使用getClass().getName(),代理的类名被打印出来,而不是这样,我使用getClass().getSuperclass().getName()来获得原始类名。

相关问题