2013-03-10 4 views
0

Я пытаюсь использовать аннотацию ManagedProperty для Injection Dependency для другого ManagedBean, но я всегда получаю NullPointerException. Я попытаюсь описать, как работает мое приложение.@ManagedProperty остается null

Это PDF-генератор. Во-первых, у меня есть страница xhtml, у которой есть вкладка. На каждой вкладке я использую тег <ui:include>. Все эти бобы имеют ViewScope.

В первой вкладке у меня есть заголовок inputText и описание textArea полей, и это странно, что эти поля работают хорошо, даже если я не использую DI.

Проблема возникает при переходе на другую вкладку, и я хочу добавить дополнительную информацию/текст.

Мое приложение работает так: я пишу текст в поле inputText(), то я нажимаю «Готово» кнопку(), который проходит this объект на завод, то я нажимаю «Print» () кнопка для создания файла .pdf. На этом рисунке вы можете увидеть PanelInneBean и ContainerBean областей.

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 lib и OpenFaces для создания вкладки.

Надеюсь, что я написал достаточно информации.

+0

В 'private InneP inn' у вас есть' частный InneP inn'. Где вы инициализируете это поле? В классе 'InneP' у вас нет аннотации' @ ManagedBean', так что это не управляемый bean-компонент, поэтому вы создаете его вручную с помощью 'new'? – partlov

+0

Я забыл добавлять аннотации к InneP ManagedBean, добавленному и до сих пор получающему NPE.Нет, я не использую слово 'new'; – insict

+0

http://stackoverflow.com/questions/6244965/sessionscoped-does-not-work-when-adding-named? – MarianP

ответ

0

Во-первых, если вы хотите, чтобы фасоль управляться JSF вы можете создать его экземпляр вручную (с new), вы должны использовать @ManagedProperty, чтобы контейнер Instantiate и установить свойство (как вы сделали с panelInneBean поле, например). В вашем случае это не сработает, потому что вы хотите использовать компонент, обработанный запросами, в компоненте с включенным сеансом, поэтому вы не можете его вводить. Причина в том, что в течение жизни одного сеанса с боковым участком будет много экземпляров экземпляров с запросом. Поэтому вам нужно получить свой экземпляр InneP другими способами.

В методах, где вы хотите использовать InneP экземпляр, вы должны вручную получить его, не назначить его на каком-то поле класса, используйте локальную переменную, как вы будете иметь еще один экземпляр в каждом запросе:

InneP inneP = (InneP) context.getApplication().getExpressionFactory() 
     .createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{inneP}", InneP.class) 
      .getValue(FacesContext.getCurrentInstance().getELContext()); 
Смежные вопросы