@ManagedProperty保持为null

时间:2013-03-10 18:45:00

标签: jsf null managed-property

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

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

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

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

我的应用程序的工作原理如下:我在inputText字段( 1 )上写了一些文字,然后按下“{1”}的“就绪”( 2 )按钮}对象出厂,然后按“打印”( 3 )按钮生成.pdf文件。在此图片中,您可以看到thisPanelInneBean区域。

enter image description here

让我来看看我的来源:

ContainerBean

工厂来源:

@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);
    }
}

最后 InneP 来源(此类生成 Paragraps 打印)在此课程中我正在 NPE

@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;
    }

打印按钮只是将列表添加到@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; } } 循环并打印所有段落;我使用iText lib和OpenFaces生成Tabbed Pane。

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

1 个答案:

答案 0 :(得分:0)

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

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

InneP