#java #reflection #ejb #named
#java #отражение #ejb #named
Вопрос:
Я знаю, что не следует использовать отражение, но это временное решение до тех пор, пока …
У меня есть 1:
@Named("PoiBean")
@SessionScoped
public class PoiBean implements ActionContext, Serializable {
private String name = "www";
@EJB
private NavigationServiceRemote nav;
@PostConstruct
private void testReflection() {
try {
nav.TestMe(this);
} catch (NoSuchMethodException ex) {
Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(PoiBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void prepareListAllForm() {
this.setName("test me");
}
}
У меня есть 2:
@Stateless(mappedName="NavigationService")
public class NavigationServiceBean implements NavigationServiceRemote, NavigationContext {
@Override
public void TestMe(ActionContext ctx) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method method = ctx.getClass().getMethod("prepareListAllForm", new Class[] {});
method.invoke(ctx, new Object[] {});
}
Объясняет: когда запускается PoiBean, вводится EJB nav, после этого в @PostConstruct я вызываю тестовый метод TestMe.
Когда я выполняю отладку, перед тем как протестировать меня name= www, внутри PoiBean::prepareListAllForm (вызывается отражением) переменная name изменяется = «test me», и после возврата имя возвращается к www.
Похоже на то, что отражение вызывает prepareListAllForm для копии PoiBean …
Чего я пытаюсь достичь сейчас, так это изменить эту переменную с помощью функции prepareListAllForm, вызываемой с использованием отражения из @EJB.
Ответ №1:
Является ли NavigationServiceRemote аннотированным @Remote? Удаленный вызов интерфейса EJB приведет к маршаллингу / отмене маршаллинга аргументов и возвращаемых значений, поэтому метод TestMe получит копию PoiBean. Вам нужно будет использовать локальный EJB, если вы хотите изменить экземпляр.
Комментарии:
1. Да, действительно, помечено как удаленный интерфейс. Это признак того, что мне следует прочитать больше. Спасибо за ваш ответ!
2. Если ответ решил вашу проблему, вы должны «принять» его, чтобы улучшить свой рейтинг (и мой!).
3. Я сделал это сейчас, извините, в первый раз на этом сайте и не знал, как это работает.