2013-03-10 85 views
0

我試圖使用ManagedProperty註釋依賴注入到另一個ManagedBean,但我總是得到NullPointerException。我將嘗試描述我的應用程序如何工作。@ManagedProperty保留爲空

這是一個PDF生成器。首先,我有xhtml頁面有一個選項卡式窗格。在每個標籤中,我使用<ui:include>標籤。所有這些豆都有ViewScope

在第一個標籤我有標題inputText和描述textArea領域,這是奇怪的,因爲這個領域工作得很好,即使我不使用DI。

我的問題開始時,我去另一個標籤,我想添加一些額外的信息/文字。

我的應用程序是這樣的:我寫的一些文字inputText字段(),然後我按「準備就緒」()按鈕傳遞this對象的工廠,然後我按下「打印」( )按鈕生成.pdf文件。在這張圖片中你可以看到PanelInneBeanContainerBean區域。

enter image description here

讓我告訴我的消息來源:

@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庫和OpenFaces來生成選項卡式窗格。

我希望我寫了足夠的信息。

+0

在'私人InneP客棧'你有'私人InneP客棧'。你在哪裏初始化該領域?在'InneP'類中,你沒有'@ ManagedBean'註釋,所以它不是託管bean,所以你用'new'手動創建它? – partlov 2013-03-10 19:04:33

+0

我忘了添加註釋到InneP ManagedBean現在添加並仍然獲得NPE。不,我不使用'新'字; – insict 2013-03-10 19:12:04

+0

http://stackoverflow.com/questions/6244965/sessionscoped-does-not-work-when-adding-named? – MarianP 2013-03-10 19:14:52

回答

0

首先,如果你想通過bean的JSF來管理,你可以(與new)手動實例化它,你必須使用@ManagedProperty讓容器來實例化設置你的財產(像你panelInneBean領域一樣,例如)。在你的情況下,這不起作用,因爲你想在會話作用域bean中使用request scoped bean,所以你不能注入它。原因是因爲在一個會話範圍bean的生命週期中,會有很多請求範圍的bean實例。所以你需要以其他方式獲得InneP實例。

在你想用你InneP實例來手動獲取它,不給它分配上的一些類字段的方法,使用本地變量,你將有另一個實例在每一個請求:

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