2013-12-11 3 views
0

У меня возникла проблема с DI весной. Мое приложение объединяет PrimeFaces & Spring и использует Spring для DI и создания управляемых компонентов.@ Важная аннотация и NullPointerException

У меня есть <p:datatable>, и когда пользователь выбирает строку и кнопку push, мое приложение открывает динамическое диалоговое окно с другой сеткой, чтобы отобразить выбранную строку. Я хочу иметь две отдельные обработанные бобы для каждой сетки.

Моя страница .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. 

} 

Второй боб - вот проблема:

@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. 

Единственное, что я хочу, это сохранить ссылку на DefinicjeParametrow instan из другого компонента (это мой выбранный ряд). Я попытался изменить область бобов, но это не сработало. Вторая вещь, которую я пробовал, заключалась в том, чтобы автоувеличивать весь WartosciParametruGridBean, используя @Autowired, но это также не удалось.

Когда отображается диалоговое окно, я следующее исключение:

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.

ответ

2

Объект должен быть сконструирован до того, как Весна может вводить в него любые значения.

Таким образом, на этом этапе

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

Поле definicjeParametrow еще null. Вы всегда можете autowire parametrySystemoweGridBean непосредственно в конструкторе

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

Я не знаю интеграции JSF с Spring (или наоборот), так что я не могу гарантировать решение, но основной причиной является один пояснено выше.

+0

Вы УДИВИТЕЛЬНЫ! Он работает отлично, и это так просто! Если вы когда-нибудь в Польше просто позвоните мне - я должен купить вам бутылку нашей лучшей польской водки;) –

Смежные вопросы