2010-04-28 4 views
2

У меня есть собственный класс EntityHome. Я подключаю зависимый объект к проводному методу, но когда я вызываю действие (persist), проводной компонент всегда равен нулю.Проводной компонент null в шве EntityHome action

В чем может быть причина, аналогичный код, созданный швом gen, по-видимому работает.

Это класс сущности.

Компонент round.teeSet всегда имеет значение null, когда вызывается persist, хотя оно показано на странице jsf.

Примечание: версия Шва: 2.2.0.GA Jboss: jboss-5.1.0.GA

Я overrden сохраняется метод для входа значения проводного элемента.

@Name("roundHome") 
@Scope(ScopeType.CONVERSATION) 
public class RoundHome extends EntityHome<Round>{ 

    @In(required = false) 
    private Golfer currentGolfer; 

    @In(create = true) 
    private TeeSetHome teeSetHome; 

    @Override 
    public String persist() { 
     logger.info("Persist called"); 
     if (null != getInstance().getTeeSet()) { 
      logger.info("teeSet not null in persist"); 
     } else { 
      logger.info("teeSet null in persist"); 
      // wire(); 
     } 
     String retVal = super.persist(); //To change body of overridden methods use File | Settings | File Templates. 
     return retVal; 
    } 

    @Logger 
    private Log logger; 

    public void wire() { 

     logger.info("wire called"); 
     TeeSet teeSet = teeSetHome.getDefinedInstance(); 


     if (null != teeSet) { 
      getInstance().setTeeSet(teeSet); 
      logger.info("Successfully wired the teeSet instance with color: " + teeSet.getColor()); 
     } 
    } 

    public boolean isWired() { 
     logger.info("is wired called"); 
     if(null == getInstance().getTeeSet()) { 
      logger.info("wired teeSet instance is null, the button will be disabled !"); 
      return false; 
     } 
     else { 
      logger.info("wired teeSet instance is NOT null, the button will be enabled !"); 
      logger.info("teeSet color: "+getInstance().getTeeSet().getColor()); 
      return true; 
     } 
    } 

    @RequestParameter 
    public void setRoundId(Long id) { 
     super.setId(id); 
    } 

    @Override 
    protected Round createInstance() { 
     Round round = super.createInstance(); 
     round.setGolfer(currentGolfer); 
     round.setDate(new java.sql.Date(System.currentTimeMillis())); 
     return round; 
    } 
} 

Здесь XHTML

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 


<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:s="http://jboss.com/products/seam/taglib" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:a="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    template="layout/template.xhtml"> 

<ui:define name="body"> 
    <h:form id="roundform"> 
     <rich:panel> 
      <f:facet name="header>"> 
       #{roundHome.managed ? 'Edit' : 'Add' } Round 
      </f:facet> 
      <s:decorate id="dateField" template="layout/edit.xhtml"> 
       <ui:define name="label">Date:</ui:define> 
       <rich:calendar id="date" datePattern="dd/MM/yyyy" value="#{round.date}"/> 
      </s:decorate> 


      <s:decorate id="notesField" template="layout/edit.xhtml"> 
       <ui:define name="label">Notes:</ui:define> 
       <h:inputTextarea id="notes" cols="80" rows="3" value="#{round.notes}" /> 
      </s:decorate> 


      <s:decorate id="totalScoreField" template="layout/edit.xhtml"> 
       <ui:define name="label">Total Score:</ui:define> 
       <h:inputText id="totalScore" value="#{round.totalScore}" /> 
      </s:decorate> 


      <s:decorate id="weatherField" template="layout/edit.xhtml"> 
       <ui:define name="label">Weather:</ui:define> 
       <h:selectOneMenu id="weather" value="#{round.weather}"> 
        <s:selectItems var="_weather" value="#{weatherCategories}" label="#{_weather.label}" 
            noSelectionLabel=" Select " /> 
        <s:convertEnum/> 
       </h:selectOneMenu> 
      </s:decorate> 


      <div style="clear: both;"> 
       <span class="required">*</span> required fields 
      </div> 
     </rich:panel> 

     <div class="actionButtons"> 
      <h:commandButton id="save" value="Save" 
          action="#{roundHome.persist}" 
          rendered="#{!roundHome.managed}" /> 
      <!-- disabled="#{!roundHome.wired}" /> --> 

      <h:commandButton id="update" value="Update" action="#{roundHome.update}" 
          rendered="#{roundHome.managed}" /> 

      <h:commandButton id="delete" value="Delete" action="#{roundHome.remove}" 
          rendered="#{roundHome.managed}" /> 

      <s:button id="discard" value="Discard changes" propagation="end" 
         view="/Round.xhtml" rendered="#{roundHome.managed}" /> 

      <s:button id="cancel" value="Cancel" propagation="end" 
         view="/#{empty roundFrom ? 'RoundList' : roundFrom}.xhtml" 
         rendered="#{!roundHome.managed}" /> 

     </div> 

     <rich:tabPanel> 
      <rich:tab label="Tee Set"> 
       <div class="association"> 
        <h:outputText value="Tee set not selected" rendered="#{round.teeSet == null}" /> 
        <rich:dataTable var="_teeSet" value="#{round.teeSet}" rendered="#{round.teeSet != null}"> 
         <h:column> 
          <f:facet name="header">Course</f:facet>#{_teeSet.course.name} 
         </h:column> 
         <h:column> 
          <f:facet name="header">Color</f:facet>#{_teeSet.color} 
         </h:column> 
         <h:column> 
          <f:facet name="header">Position</f:facet>#{_teeSet.pos} 
         </h:column> 
        </rich:dataTable> 
       </div> 
      </rich:tab> 
     </rich:tabPanel> 
    </h:form> 
</ui:define> 
</ui:composition> 

ответ

2

Я полагаю, у вас есть единственный ScopeType.CONVERSATION (RoundHome) экземпляр без какого-либо затянувшегося разговора включен. Таким образом, у вас может быть Временная беседа, которая сохранится до фазы ответа рендера.

Когда вы отправляете свою форму, потому что у вас есть Временный разговор, вы просто заполняете то, что отправляете. Это объясняет, почему ваш TeeSet имеет значение null. (Ваша представленная форма не содержит никаких ссылок на тройник, например)

Если вы действительно хотите, чтобы ваша TeeSet выжить до следующего представить, вы должны включить затянувшийся разговор перед показом и отключить после отправки формы ,

Просто совет: Каждый Home экземпляр по умолчанию ScopeType.CONVERSATION - унаследованного от дома. Таким образом, вы можете настроить свой RoundHome следующим образом:

@Name("roundHome") 
public class RoundHome extends EntityHome<Round> { 

    ... 

} 
+0

Спасибо, похоже, вы ударились головой о гвоздь. Но как я могу узнать, есть ли временная беседа. Более того, другие примеры книги, которые работают, не показывают никакого кода для начала длительной беседы. – rangalo

+0

Я нашел его, он запущен в дескрипторе страницы, спасибо. – rangalo

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