Отражение Java не изменяет мои переменные bean-компонента @Named - PullRequest
1 голос
/ 15 апреля 2011

Я знаю, что не следует использовать отражение, но это временное решение, пока ...

У меня есть 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.

Когда я отлаживаюсь, прежде чем Test me name = www, внутри PoiBean :: prepareListAllForm (вызываетсяотражение), переменная имени модифицируется = "проверить меня", и после возврата имя возвращается к www.

Это как вызовы рефлексии prepareListAllForm для копии PoiBean ...

Что ясейчас нужно изменить эту переменную, используя функцию prepareListAllForm, вызываемую с помощью отражения из @ EJB.

1 Ответ

0 голосов
/ 15 апреля 2011

Является ли NavigationServiceRemote аннотированным @Remote?Удаленный вызов интерфейса EJB приведет к маршаллингу / отмене маршалинга аргументов и возвращаемых значений, поэтому метод TestMe получит копию PoiBean.Вам нужно будет использовать локальный EJB, если вы хотите изменить экземпляр.

...