Ошибка NullPointerException при попытке получить значение из другого компонента в JSF - PullRequest
1 голос
/ 12 декабря 2011

У меня есть два компонента поддержки:

  • Login: компонент, проверяющий информацию для входа в систему пользователя (имя пользователя и пароль) с таблицей базы данных.
  • Buss_Services:другой компонент, выполняющий некоторые бизнес-сервисы.

Мне нужно получить идентификатор пользователя из компонента Login и использовать его внутри Buss_Services.Он хранится в свойстве String Login, и Buss_Services необходимо это значение для отслеживания текущего пользователя, вошедшего в систему, и обновления базы данных.

Вот вспомогательный компонент Login:

@ManagedBean(name="Login")
@SessionScoped
public class Login {
    private String loggedUserID;

    public Object logCB_action() {
        try {
            // ...
            rs = stmt.executeQuery(SQL);
            while (rs.next()) {
                if (rs.getString("USER_NAME").equals(uname)) {
                    if (rs.getString("USER_PW").equals(pword)) {

                     // Here, the user ID is set.
                    loggedUserID=rs.getString("USER_ID");// This line ...


                    System.out.println("Logged User (ID): "+ userID);

                        return ("displayApp");
                    }
                }
            }
        }

        // ...
    }        

    public String getLoggedID() {
        // Here, the user ID is returned.
        String id = loggedUserID;
        return (id);
    }

}

Вот вспомогательный бин Buss_Services, который вызывает метод getLoggedID():

@ManagedBean(name="Buss_Services")
@SessionScoped
public class Buss_Services {



    @ManagedProperty("#{Login}")
    private Login login;

    public void newEst_action() {
        // The following line throws NullPointerException.
        System.out.println("Logged User (ID): " + login.getLoggedID());       
    }

    // Getters/setters.
}

Это трассировка стека, которую я получаю, когда пытаюсь получить доступ к странице бизнес-услуг:

javax.faces.el.EvaluationException:
//C:/Users/Sultan09/AppData/Roaming/JDeveloper/system11.1.2.0.38.60.17/o.j2ee/drs/TheOCES/OCES.ViewControllerWebApp.war/App_Business_SerivesPG.jsf @68,140 action="#{backingBeanScope.App_BServPG_Bean.newEst_action}": java.lang.NullPointerException

at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:51)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:190)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._invokeApplication(LifecycleImpl.java:965)
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._executePhase(LifecycleImpl.java:346)
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:204)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:173)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.adfinternal.view.faces.webapp.rich.RegistrationFilter.doFilter(RegistrationFilter.java:121)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:468)
at oracle.adfinternal.view.faces.activedata.AdsFilter.doFilter(AdsFilter.java:60)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:468)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:293)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:199)
at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:111)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:313)
at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:413)
at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:94)
at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:161)
at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:71)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:136)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178

 Caused by: java.lang.NullPointerException
    at JavaView.backing.Buss_Services.newEst_action(Buss_Services.java:172)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)
    at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:46)
    ... 44 more

Как это вызвано и как я могу это решить?


ОБНОВЛЕНИЕ : Согласно комментариям здесь и личному поиску по вопросам, аналогичным изложенным здесь,Проблема окончательно решена, слава богу.Решение состояло в том, что мне пришлось:

  1. добавить <managed-property> имени входа в файл adfc-config.xml.
  2. , что более важно, получите loggedUserID внутри @PostConstruct аннотированного метода init ().Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011
System.out.println("Logged User (ID): " + login.get_final_logged_ID());       

A NullPointerException в этой строке имеет единственно возможную причину, по которой login равно null. Учитывая тот факт, что @ManagedProperty выглядит нормально, это может иметь только одну возможную причину: метод установки setLogin() не работает. Убедитесь, что это выглядит именно так:

public void setLogin(Login login) {
    this.login = login;
}

и, следовательно, не

public void setLogin(Login login) {
    login = login;
}

или что-то еще.


Обновление согласно комментариям:

Что касается face-config.xml, то здесь дело в том, что бины служб Login и bussiness для их соответствующих jsf-страниц определены как "backingBean" в <managed-bean-scope>. В бобах Java, как вы видели, я определил их sessionScoped.

Наконец, есть причина вашей проблемы. Конфигурация в faces-config.xml переопределяет все аннотации JSF2 на соответствующем компоненте. Вы, очевидно, не настроили <managed-property> в faces-config.xml. У вас есть 2 варианта:

  1. Удалить всю <managed-bean> конфигурацию в faces-config.xml. Весь смысл новых аннотаций JSF 2.x, таких как @ManagedBean, @ManagedProperty и т. Д., Состоит в том, чтобы избавиться от многословной конфигурации XML в стиле JSF 1.x.

  2. Добавьте <managed-property> значение #{Login} к <managed-bean> из Buss_Services.

    <managed-property>
        <property-name>login</property-name>
        <value>#{Login}</value>
    </managed-property>
    

Не связано с конкретной проблемой. У вас есть несколько серьезных недостатков в дизайне и стиле кода.

  • Вы должны не ссылаться UIComponent s как свойства. Вместо этого вы должны ссылаться на его значения. Сохраняйте модель как можно более простой и никогда не используйте UIComponent, если у вас нет действительно веской причины. Э.Г.

    private String username;
    private String password;
    private Long userID;
    
  • Ваш метод проверки логина неэффективен. Похоже, что вся пользовательская таблица переносится из БД в память Java, где вы тестируете каждую отдельную строку. Вы должны попытаться написать и точно настроить SQL-запрос как можно больше, чтобы он возвращал в точности информацию, которую вы ищете.

    statement = connection.prepareStatement("SELECT id FROM Users WHERE username = ? AND password = MD5(?)");
    statement.setString(1, username);
    statement.setString(2, password);
    resultSet = statement.executeQuery();
    
    if (resultSet.next()) {
        userID = resultSet.getLong("id");
    }
    
  • Ваш PHP-подобный стиль кода полностью противоречит Java Naming Convention . Это затрудняет чтение и поддержку кода всеми другими разработчиками Java, такими как те, от кого вы ожидаете ответов при размещении кода в Интернете, как здесь. Имена пакетов должны быть строчными. Подчеркивания действительны только в константах, для всех остальных имен следует использовать CamelCase. Имена экземпляров (например, имена управляемых компонентов) должны начинаться со строчной буквы. Etcetera.

0 голосов
/ 12 декабря 2011

Пожалуйста, проверьте, если ваш ManagedProperty login не ноль, когда вы печатаете идентификатор.

и попробуйте @ManagedProperty(value = "#{Login}")!

0 голосов
/ 12 декабря 2011

Ok NullPointerException - это очень общий класс ошибок, которые не имеют ничего общего с jsf, вашим уровнем доступа к базе данных и т. Д.И, насколько я могу судить по трассировке стека, она выбрасывается изнутри функции newEst_action, для которой вы не предоставили никакого кода.Перейдите к конкретной строке в этой функции, то есть 172, и посмотрите, делаете ли вы что-то вроде

 myObject.doSomething()

, не проверяя, может ли объект быть нулевым, он может выбросить NPE, если myObject равен null, поэтому сделайте что-то вроде

if (myObject!=null)
    myObject.doSomething()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...