【问题标题】:injected statless bean into managed bean gives nullpointer在托管 bean 中注入无状态 bean 给出空指针
【发布时间】:2013-03-14 04:11:11
【问题描述】:

我有一个 ManagedBean,它注入了一个无状态 bean,但它总是给我一个用于注入的空指针。我在这里做错了什么? (我正在学习 JSF,它只是一个例子,所以请忽略类的命名等)

有两个不同的 jar(web.jar 和 services.jar)

托管豆

@ManagedBean
@RequestScoped
public class HelloPB
{
    @Inject
    private ExamServiceBase examService;

    private String name = "";

    public String getName()
    {
        Exam exam = examService.getSingleExam();
        return exam.getName();
    }

    public void setName(final String name)
    {
        //this.name = name;
    }

    public String getHello()
    {
        if ( name == null || name.length() < 1 )
        {
            return null;
        }
        return "Hello " + name;
    }
}

无状态豆

@Stateless
public class ExamServiceBase implements ExamService{

    @PersistenceContext(name="QuestifyPersistUnit")
    private EntityManager em;

    public Exam getExam(String id){
        return em.find(Exam.class, id);
    }

    public Exam getSingleExam(){
        return em.find(Exam.class, "9E69F3EE-AE9E-4D53-B531-35504EDA450F");
    }   
}

index.xhtml

<h:body>
    <h:outputScript name="jsf.js" library="javax.faces" target="body">
    </h:outputScript>
    <h1>JSF 2 Demo</h1>
    <h:form>

        <h:inputText id="name" value="#{helloPB.name}">
            <f:ajax render="helloTextOutput" />
        </h:inputText>

        <h:commandButton value="Say Hi via Ajax">
            <f:ajax execute="name" render="helloTextOutput" />
        </h:commandButton>
        <h:outputText id="helloTextOutput" value="#{helloPB.hello}" />
    </h:form>

</h:body>

【问题讨论】:

  • ExamServiceBase 是一个 EJB,那么您是否尝试过通过 EJB 注解注入它?我不确定它是否适用于 Inject...
  • @perissf,它有效并且完全合法。 @Martin,ExamService@Local 接口吗?如果是,你应该尝试注入它
  • @kolossus 我确实有一个本地接口,这就是我最初使用的接口,但它或我的实际实现都不起作用。两者都给出空指针异常

标签: jsf jakarta-ee managed-bean stateless


【解决方案1】:

我遇到了类似的问题。确保最初在您的应用程序中有一个文件 WEB-INF/beans.xml。它也可以是一个空文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

然后尝试使用从 postcostruct 方法注入的 Bean。就我而言,它以这种方式工作。

@PostConstruct
void init() {
Exam exam = examService.getSingleExam();
}

【讨论】:

  • 我将在今天晚些时候尝试一下,但是,这看起来像是一个 hack,而不是一个可靠的解决方案。 =
  • 我将在今天晚些时候尝试这个,但是,它似乎是一个 hack。有什么理由可以这样做吗?不过感谢您的帮助!
  • @Marthin,这不是黑客攻击,而是 CDI 工作的实际要求。您的网络应用程序(如果适用)的 WEB-INF 中必须有 beans.xml 文件,才能使注入工作
  • 我已经添加了 beans.xml 文件。还是同样的问题。还有什么idee的吗?
猜你喜欢
  • 2015-01-23
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多