【问题标题】:@Value annotation & NullPointerException@Value 注释 & NullPointerException
【发布时间】:2013-12-30 02:33:04
【问题描述】:

我在 Spring 中遇到了 DI 问题。我的应用程序集成了 PrimeFaces 和 Spring,并使用 Spring 进行 DI 和创建托管 bean。

我有一个<p:datatable>,当用户选择一行并按下按钮时,我的应用程序会打开一个动态对话框,其中包含另一个网格以显示所选行。我想为每个网格有两个单独的豆子。

我的 .jsf 页面非常简单 - 只是一个 <p:datatable> 和延迟加载的 <p:dialog>

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">

<h:body>

    <ui:composition template="../templates/layout.xhtml">

    <ui:define name="title">
            PrimeFaces webPage
    </ui:define>

    <ui:define name="content">

        <h:form style="height:90%;">
                <p:dataTable value="#{parametrySystemoweGridBean.definicjeParametrowModel}" var="definicjeParametrow" id="definicjeParametrowGrid"
                    rowKey="#{definicjeParametrow.id}" paginator="true" rows="10"  filteredValue="#{parametrySystemoweGridBean.filteredDefinicjeParametrowList}"
                    selection="#{parametrySystemoweGridBean.definicjaParametruSelected}" rowsPerPageTemplate="5, 10, 15, 20"
                    selectionMode="single" scrollHeight="100%" scrollable="true">

                    <!-- Columns -->

                    <f:facet name="footer">
                        <p:commandButton value="Wartości parametru" onclick="PF('wartosciDialog').show();">
                        </p:commandButton>

                        <p:commandButton value="Odśwież" actionListener="#{parametrySystemoweGridBean.refresh}" update="definicjeParametrowGrid">
                        </p:commandButton>
                    </f:facet>

                </p:dataTable>
            </h:form>

            <p:dialog widgetVar="wartosciDialog" header="Wartości parametru #{parametrySystemoweGridBean.definicjaParametruSelected.id}"
                appendTo="@(body)" dynamic="true">
                <h:form style="height:90%;">
                    <p:dataTable id="wartosciGrid" var="wartoscParametru" selectionMode="single" scrollHeight="100%" scrollable="true"
                        value="#{wartosciParametruGridBean.wartosciParametrowModel}" rendered="true">

                        <!-- Columns -->

                    </p:dataTable>
                </h:form>
            </p:dialog>

    </ui:define>

    </ui:composition>


</h:body>

</html>

第一个豆子:

@Component("parametrySystemoweGridBean")
@Scope("request")
public class ParametrySystemoweGridBean {

    private DefinicjeParametrow definicjaParametruSelected;

    public ParametrySystemoweGridBean() {
    }

    //Some other stuff - getters, setters etc.

}

第二个 bean - 这是问题所在:

@Component("wartosciParametruGridBean")
@Scope("request")
public class WartosciParametruGridBean {

    private final Logger log = Logger.getLogger(WartosciParametruGridBean.class);

    private WartosciParametrowModel wartosciParametrowModel;

    private WartosciParametrow selected;

    @Value("#{parametrySystemoweGridBean.definicjaParametruSelected}")
    private DefinicjeParametrow definicjeParametrow;

    public WartosciParametruGridBean() {
        this.log.info(this.definicjeParametrow.getKod());
    }

    //Some other stuff - getters, setters etc.

我唯一想要的是保持对另一个 bean 的 DefinicjeParametrow 实例的引用(这是我选择的行)。我试图改变我的 bean 范围,但没有奏效。我尝试的第二件事是使用@Autowired 自动连接整个 WartosciParametruGridBean,但它也失败了。

显示对话框时出现以下异常:

SEVERE: Error Rendering View[/pages/parametry.xhtml]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wartosciParametruGridBean' defined in file [...]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [pl.sygnity.cbop.admin.web.beans.WartosciParametruGridBean]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1007)
...

拜托,你能帮我吗?我在春天真的被困住了,还是个新手。我正在使用最新的 Primefaces 4.0、JSF Mojarra 2.2.4 和 Spring 3.2.5.RELEASE。

【问题讨论】:

    标签: java spring jsf primefaces annotations


    【解决方案1】:

    在 Spring 可以向其中注入任何值之前,需要先构造该对象。

    所以在这一步

    public WartosciParametruGridBean() {
        this.log.info(this.definicjeParametrow.getKod());
    }
    

    字段definicjeParametrow 仍然是null。您始终可以将 parametrySystemoweGridBean 直接自动装配到您的构造函数中

    @Autowired
    public WartosciParametruGridBean(ParametrySystemoweGridBean parametrySystemoweGridBean) {
        this.log.info(this.parametrySystemoweGridBean.getDefinicjeParametrow().getKod());
    }
    

    我不知道 JSF 与 Spring 的集成(反之亦然),所以我不能保证解决方案,但根本原因是上面解释的那个。

    【讨论】:

    • 你太棒了!它工作得很好,而且很简单!如果你要来波兰就给我打电话——我得给你买一瓶我们最好的波兰伏特加;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多