【问题标题】:@ManagedProperty stays null@ManagedProperty 保持为空
【发布时间】:2013-03-10 18:44:59
【问题描述】:

我正在尝试使用ManagedProperty 注释对另一个ManagedBean 进行依赖注入,但我总是得到NullPointerException。我将尝试描述我的应用程序是如何工作的。

这是一个 PDF 生成器。首先,我有xhtml 页面,它有一个选项卡式窗格。在每个选项卡中,我使用<ui:include> 标签。所有这些 bean 都有 ViewScope

在第一个选项卡中,我有标题 inputText 和描述 textArea 字段,这很奇怪,因为即使我不使用 DI,这些字段也运行良好。

当我转到另一个选项卡时,我的问题就开始了,我想添加一些额外的信息/文本。

我的应用程序是这样工作的:我向 inputText 字段 (1) 写入一些文本,然后按下传递 this 对象的“就绪”(2) 按钮到工厂,然后我按“打印”(3)按钮生成.pdf文件。在这张图片中你可以看到PanelInneBeanContainerBean 区域。

让我展示一下我的来源:

@ManagedBean(name="inne")
@ViewScoped
public class PanelInneBean extends AbstractPanel implements Serializable {
    private static final long serialVersionUID = 1L;
    private final int CODE = 4;
    private boolean use;
    private String tytul, opis;
    private PdfFactory pdf;

    @PostConstruct
    private void init() {
    pdf = PdfFactory.getPdfObject();
    use = false;
    }

    public PanelInneBean() {
    }

    public boolean getUse() {
    return use;
    }

    public String getTytul() {
    return tytul;
    }

    public void setTytul(String tytul) {
    this.tytul = tytul;
    }

    public String getOpis() {
    return opis;
    }

    public void setOpis(String opis) {
    this.opis = opis;
    }

    public int getCode() {
    return CODE;
    }

    private void add() {
    use = true;
    }

    public void addBean() {
    add();
    pdf.addElement(this);
    System.out.println("InnePanel after pdf.addElement() this.opis:" + this.opis);
    }
}

厂家来源:

@ManagedBean(name="factory")
@SessionScoped
public class PdfFactory implements Serializable {
//.............
private InneP inn = new InneP() //without new does not work too;
//.............

    public int addElement(PdfElement element) {
    pdfType = true;
    if (element.getUse()) {
        elementList.add(element);
        return 1;
    }
    return 0;
    }

//.............

public List<Element> getDocumentBody() throws DocumentException {
    initSignature();
    List<Element> list = new ArrayList<Element>();
    list.add(createDocDate());
    list.add(Chunk.NEWLINE);
    for (PdfElement p : elementList) {
        if (p.getUse()) {
        switch (p.getCode()) {
//............
        case 4:
            list.addAll(inn.generatePharse());
            break;
        }
        }
    }
    list.addAll(sF.generatePharse());
    return list;
    }

最后一个 InneP 源(这个类生成 Paragraps 打印)在这个类中我得到 NPE

@ManagedBean
@RequestScoped
public class InneP {
    private List<Element> list = new ArrayList<Element>();
    private Font font;

    @ManagedProperty("#{inne}")
    private PanelInneBean panelInneBean;

    public InneP(){}

    public InneP(Font font) {
    this.font = font;
    }

    public void setPanelInneBean(PanelInneBean inne) {
    this.panelInneBean = inne;
    }

    public List<Element> generatePharse() {
    if (panelInneBean.getTytul().length() > 0) {
        System.out.println("drukowanie tytulu");
        list.add(createTitle(panelInneBean.getTytul()));
        list.add(Chunk.NEWLINE);
    }
    if (panelInneBean.getOpis().length() > 0) {
        list.add(createDescription(panelInneBean.getOpis()));
        list.add(Chunk.NEWLINE);
    }

    return list;
    }

    private Paragraph createTitle(String tytul) {
    System.out.println("inne tytul: " + tytul);
    font.setStyle(Font.NORMAL);
    Paragraph t = new Paragraph(tytul, font);
    t.setAlignment(Element.ALIGN_LEFT);
    return t;
    }

    private Paragraph createDescription(String opis) {
    System.out.println("inne opis:" + opis);
    font.setStyle(Font.BOLD);
    Paragraph d = new Paragraph(opis, font);
    d.setAlignment(Element.ALIGN_LEFT);
    return d;
    }

}

打印按钮只是将列表添加到for循环并打印所有段落;我使用 iText lib 和 OpenFaces 来生成选项卡式窗格。

我希望我写了足够的信息。

【问题讨论】:

  • private InneP inn 你有private InneP inn。你在哪里初始化那个字段?在InneP 类中,您没有@ManagedBean 注释,因此它不是托管bean,因此您使用new 手动创建它?
  • 我忘记向 InneP ManagedBean 添加注释,现在添加并仍在获取 NPE。不,我不使用new 字;
  • 更新问题,使其与您的代码相同。我还告诉你的私人领域inn 没有ManagedProperty。只需更新所有内容,然后编辑您的问题。
  • 类 PdfFactory 中的 inn 变量在任何地方都没有初始化以很好地工作 ManagedProperty。

标签: jsf null managed-property


【解决方案1】:

首先,如果你想让 bean 由 JSF 管理,你可以手动实例化它(使用 new),你必须使用 @ManagedProperty 让容器实例化并设置你的属性(就像你对 panelInneBean 字段所做的那样,例如)。在您的情况下,这将不起作用,因为您想在会话范围的 bean 中使用请求范围的 bean,所以您不能注入它。原因是因为在一个会话范围 bean 的生命周期中,将有许多请求范围 bean 实例。因此,您需要通过其他方式获取您的 InneP 实例。

在您想使用InneP 实例的方法中,您必须手动获取它,不要将它分配给某个类字段,使用局部变量,因为您在每个请求中都会有另一个实例:

InneP inneP = (InneP) context.getApplication().getExpressionFactory()
        .createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{inneP}", InneP.class)
            .getValue(FacesContext.getCurrentInstance().getELContext());

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2018-11-19
    • 2014-08-29
    • 2016-06-30
    • 2012-07-24
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多