CDI @inject не может создать экземпляр моей службы

у меня проблема с моей аннотацией @inject, она не может создать экземпляр моей службы. я безуспешно следую каждому учебнику и официальному документу. пожалуйста, помогите мне разобраться в моей проблеме.

мой контроллер: `

@Named
@ManagedBean
@RequestScoped
public class LoginAction {

    private Logger logger = LoggerFactory.getLogger( LoginAction.class );

    @Size(min = 5 , message = "#{msg.auth_txtLog_minLeng}")
    private String txtUserName;
    @Size(min = 5 , message = "#{msg.auth_txtPwd_minLeng}")
    private String txtPassWord;



    @Inject
    private UserService userService;

мой сервис, который вызывает мой DAO

  @Named
  public class UserServiceImpl implements UserService {

    @Inject
    UserDao userDao;

я получаю исключение nullPointerException:

> ATTENTION: #{loginAction.logIn}: java.lang.NullPointerException
javax.faces.FacesException: #{loginAction.logIn}: java.lang.NullPointerException
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 23 more
Caused by: java.lang.NullPointerException
    at ma.trk.sgpa.controller.LoginAction.logIn(LoginAction.java:35)
    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 org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 24 more
6 déc. 2013 11:37:43 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/sgpa-jsf] threw exception [java.lang.NullPointerException] with root cause

person KhairiB    schedule 06.12.2013    source источник
comment
Что происходит? Вы получаете исключение? Вы должны предоставить нам больше информации.   -  person Keppil    schedule 06.12.2013
comment
Вы определили свой META-INF/beans.xml?   -  person Keerthivasan    schedule 06.12.2013
comment
я определяю свой beans.xml в WEB-INf, я перемещу его в META-INf, и я замечу вас... я переехал, и он не работает   -  person KhairiB    schedule 06.12.2013
comment
С каких это пор вы можете аннотировать компонент как @ManagedBean, так и @Named? Если это вообще возможно, из какого пакета взялся @RequestScoped? :С   -  person Mr.J4mes    schedule 06.12.2013
comment
@Mr.J4mes пакет пришел из javax.enterprise.context.RequestScoped, и я попытался изменить javax.faces.bean.RequestScoped. но без эффекта   -  person KhairiB    schedule 06.12.2013
comment
@TarikFakhouri: Если вы используете javax.enterprise.context.RequestScoped, просто удалите аннотацию @ManagedBean и повторите попытку.   -  person Mr.J4mes    schedule 06.12.2013
comment
до сих пор не работает. если я удалю @ManagedBean, моя страница Xhtml не знает моих полей   -  person KhairiB    schedule 06.12.2013


Ответы (1)


Stacktrace говорит, что вы используете Tomcat, как указано org.apache.tomcat/coyote/catalina.* строками. Тем не менее, Tomcat представляет собой базовый контейнер JSP/Servlet, изначально не поддерживающий CDI, его необходимо устанавливать отдельно (как вы сделали для JSF).

Stacktrace также говорит, что bean-компонентом управляет не @Named, а @ManagedBean, на что указывает полное отсутствие подписи прокси-класса CDI в основной причине. Если бы @Named действительно использовался, вы бы увидели дополнительную строку, как показано ниже, когда Weld используется в качестве реализации CDI:

Caused by: java.lang.NullPointerException
    at ma.trk.sgpa.controller.LoginAction.logIn(LoginAction.java:35)
--> at ma.trk.sgpa.controller.LoginAction$Proxy$_$$_WeldClientProxy.logIn(LoginAction$Proxy$_$$_WeldClientProxy.java)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

Кроме того, ваш комментарий

до сих пор не работает. если я удалю @ManagedBean, моя страница Xhtml не знает моих полей

подтверждает, что CDI вообще неправильно установлен. Также удивительно, что вы нигде явно не упомянули, как именно вы его установили, потому что Tomcat + CDI - это особый случай, который подтверждает, что вы действительно понятия не имели, что делаете. Возможно, вы только что столкнулись с ошибкой компиляции на @Named и @Inject и просто вслепую скачали/переместили/скопировали случайные файлы JAR в небрежной попытке решить эти ошибки компиляции, фактически не читая документацию по реализации CDI в отношении настройки Tomcat.

Перейдите к следующему ответу, чтобы узнать, как заставить CDI работать в Tomcat: Как установить и использовать CDI на Tomcat?.

person BalusC    schedule 06.12.2013
comment
до того, как я начал работать с CDI, я прочитал официальный документ от Oracle и сделал несколько примеров с galssfish sever и jboss, и он работал нормально. вот почему я хочу разработать приложение с tomcat, я не знал, что у tomcat + CDI есть особый случай. в любом случае спасибо, я ценю вашу честность. - person KhairiB; 06.12.2013
comment
GlassFish и JBoss — полноценные контейнеры Java EE. Они представляют собой полные реализации Java EE, которые уже включают в себя JSF, EJB, CDI, JPA и т. д. Tomcat — это простой контейнер JSP/Servlet для бедняков, который не объединяет ничего, кроме JSP/Servlet/EL. Все остальные артефакты Java EE, такие как JSF, CDI и т. д., необходимо установить отдельно в виде JAR-файлов в /WEB-INF/lib. Как еще вы получили код JSF для компиляции и запуска на Tomcat? - person BalusC; 06.12.2013
comment
я использую maven, поэтому я добавил jsf-api и jsf-impl в pom.xml - person KhairiB; 06.12.2013
comment
Это один из способов. Maven автоматически помещает эти библиотеки в /WEB-INF/lib сборки. Кстати, если вы не поняли, вопрос в моем предыдущем комментарии был чисто риторическим. - person BalusC; 06.12.2013