[英]@ManagedProperty stays null
我正在尝试使用ManagedProperty
批注将依赖项注入到另一个ManagedBean,但是我总是得到NullPointerException
。 我将尝试描述我的应用程序如何工作。
这是一个PDF生成器。 首先,我有一个带有选项卡式窗格的xhtml
页面。 在每个选项卡中,我使用<ui:include>
标记。 所有这些bean都具有ViewScope 。
在第一个选项卡中,我具有标题inputText
和描述textArea
字段,这很奇怪,因为即使我不使用DI,该字段也能正常工作。
当我转到另一个选项卡时,我的问题开始了,我想添加一些其他信息/文本。
我的应用程序是这样的:我向inputText字段( 1 )写一些文本,然后按“ Ready”( 2 )按钮this
对象传递到工厂,然后按“ Print”( 3 )按钮生成.pdf文件。 在此图片中,您可以看到PanelInneBean
和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);
}
}
工厂货源:
@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.