0

別の ManagedBean への依存性注入への注釈を使用しようとしていますManagedPropertyが、常にNullPointerException. 私のアプリケーションがどのように機能するかを説明しようとします。

これは PDF ジェネレーターです。まず、xhtmlタブ付きペインを持つページがあります。各タブで<ui:include>タグを使用します。これらの Bean にはすべてViewScopeがあります。

最初のタブには、タイトルinputTextと説明textAreaのフィールドがありますが、DI を使用していなくても、このフィールドがうまく機能しているのは奇妙です。

私の問題は、別のタブに移動したときに始まります。追加情報/テキストを追加したいと思います。

私のアプリは次のように動作します: inputText フィールド ( 1 ) にテキストを書き込んでから、「準備完了」( 2 ) ボタンを押してthisオブジェクトをファクトリに渡し、「印刷」( 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ソース(このクラスは印刷するパラグラフを生成します)は、 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 を使用して、タブ付きペインを生成します。

十分な情報を書いたことを願っています。

4

1 に答える 1

0

まず、Bean を JSF で管理したい場合は、手動で (newを使用して)インスタンス化できます@ManagedProperty。コンテナをインスタンス化してプロパティを設定するために使用する必要があります (panelInneBeanたとえば、フィールドで行ったように)。あなたの場合、セッションスコープのBeanでリクエストスコープのBeanを使用したいので、これは機能しません。したがって、それを注入することはできません。理由は、1 つのセッション スコープ Bean の存続期間中に、多くのリクエスト スコープ Bean インスタンスが存在するためです。InnePそのため、他の方法でインスタンスを取得する必要があります。

インスタンスを使用するメソッドでInnePは、手動で取得する必要があります。クラス フィールドに割り当てるのではなく、ローカル変数を使用してください。リクエストごとに別のインスタンスが作成されるためです。

InneP inneP = (InneP) context.getApplication().getExpressionFactory()
        .createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{inneP}", InneP.class)
            .getValue(FacesContext.getCurrentInstance().getELContext());
于 2013-03-10T19:37:10.790 に答える