繁体   English   中英

@ManagedProperty保持为空

[英]@ManagedProperty stays null

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

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

在第一个选项卡中,我具有标题inputText和描述textArea字段,这很奇怪,因为即使我不使用DI,该字段也能正常工作。

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

我的应用程序是这样的:我向inputText字段( 1 )写一些文本,然后按“ Ready”( 2 )按钮this对象传递到工厂,然后按“ Print”( 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;
    }

我正在获取NPE的最后一个InneP源(该类生成Paragraps进行打印):

@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生成选项卡式窗格。

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

首先,如果要由JSF管理bean,可以手动实例化(使用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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM