Имя класса EJB - PullRequest
       1

Имя класса EJB

1 голос
/ 07 октября 2011

У меня есть такой код:

@EJB
protected SomeService service;

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

То, что я искал, было именем класса EJB, который в этом случае должен был быть чем-то вроде SomeServiceBean. Однако вместо этого я получаю $Proxy2128.

Есть ли способ получить имя фактического EJB-класса, который я реализовал, вместо прокси-класса?

Думаю, мы используем ejb 3.0 с geronimo или что-то в этом роде.

1 Ответ

2 голосов
/ 07 октября 2011

Вероятно, это плохая идея.Я подозреваю, что вам лучше заняться чем-то вроде добавления метода к компоненту, который возвращает строку типа, которая находится под вашим контролем.Простейшая такая реализация

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;
}

Это должно работать.Очевидно, вам нужно будет использовать другой класс аннотаций, если вы используете компонент с состоянием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...