【问题标题】:CDI @inject can't instantiate my serviceCDI @inject 无法实例化我的服务
【发布时间】:2013-12-23 17:09:57
【问题描述】:

我的@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

【问题讨论】:

  • 会发生什么?你有例外吗?您必须向我们提供更多信息。
  • 你定义了你的 META-INF/beans.xml 吗?
  • 我定义了我的 beans.xml 客栈 WEB-INf,我会把它移到 META-INf,我会注意到你...我移动了,但它不工作
  • 什么时候可以同时使用@ManagedBean@Named 来注释一个bean?如果有可能,@RequestScoped 来自哪个包? :S
  • @Mr.J4mes 包来自 javax.enterprise.context.RequestScoped,我试图更改 javax.faces.bean.RequestScoped。但没有效果

标签: java jsf cdi dao jsf-2.2


【解决方案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 文件,粗心地尝试解决这些编译错误,而没有实际阅读有关配置 Tomcat 的 CDI 实现文档。

前往以下答案了解如何让 CDI 在 Tomcat 中工作:How to install and use CDI on Tomcat?

【讨论】:

  • 在我使用 CDI 之前,我阅读了 oracle 的官方文档,并使用 galssfish sever 和 jboss 做了一些示例,它运行良好。这就是为什么我要使用 tomcat 开发应用程序,我不知道 tomcat + CDI 有一个特殊情况。无论如何,谢谢你,我感谢你的诚实。
  • GlassFish 和 JBoss 是成熟的 Java EE 容器。它们是完整的 Java EE 实现,已经捆绑了 JSF、EJB、CDI、JPA 等。Tomcat 是一个穷人的准系统 JSP/Servlet 容器,除了 JSP/Servlet/EL 之外不捆绑任何东西。您必须将所有其他 Java EE 工件(例如 JSF、CDI 等)作为 JAR 单独安装在 /WEB-INF/lib 中。您是如何获得在 Tomcat 上编译和运行的 JSF 代码的?
  • 我用的是maven,所以我在pom.xml中添加了jsf-api和jsf-impl
  • 这是一种方式。 Maven 自动将这些库放在构建的/WEB-INF/lib 中。顺便说一句,如果你没有明白,我之前评论中的问题纯粹是修辞。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2014-07-27
  • 2011-06-28
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多