2013-11-09 3 views
0

Два вопроса сегодня,JSF Резервное Bean свойство не сохраняется и commandLink не работает

У меня есть этот мир кода:

catalog.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"> 
    <h:head> 
     <f:facet name="first"> 
      <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
     </f:facet> 
     <title>booXtore - Catalog</title> 
     <h:outputStylesheet library="css" name="main.css"/> 
     <h:outputStylesheet library="css" name="font-awesome.css"/> 
     <!--[if lt IE 9]> 
      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> 
      <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> 
     <![endif]--> 
    </h:head> 
    <h:body> 
     <ui:include src="/WEB-INF/includes/navbar.xhtml"/> 
     <div id="wrap"> 

      <div id="main" class="container clear-top"> 

       <ol class="breadcrumb"> 
        <li class="active">Catalogue</li> 
       </ol> 

       <h:form > 
        <div class="row"> 
         <div class="col-md-6"> 
          <p:inputText id="searchBar" type="search" styleClass="form-control" placeholder="Recherche" value="#{searchProviderBean.search}"/> 
         </div> 

         <div class="col-md-4"> 
          <h:selectOneMenu styleClass="form-control" value="#{searchProviderBean.searchCategory}"> 
           <f:selectItem itemValue="#{searchProviderBean.defaultCategorySearch}" 
               itemLabel="#{searchProviderBean.defaultCategorySearch.name}"/> 
           <c:forEach items="#{searchProviderBean.categories}" var="category"> 
            <f:selectItem itemValue="#{category}" 
                itemLabel="#{category.name}"/> 
           </c:forEach> 
          </h:selectOneMenu> 
         </div> 

         <div class="col-md-2"> 
          <h:commandLink class="btn btn-info" value="Rechercher" action="#{searchProviderBean.launchSearch}"/> 
         </div> 
        </div> 
       </h:form> 
      </div> 
     </div> 
    </h:body> 
</hthml 

SearchProviderBean:

package com.booXtore; 

import com.booXtore.domain.Books; 
import com.booXtore.domain.Categories; 
import com.booXtore.service.BooksFacadeLocal; 
import com.booXtore.service.CategoriesFacadeLocal; 
import java.io.Serializable; 
import java.util.List; 
import javax.ejb.EJB; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@ViewScoped 
public class SearchProviderBean implements Serializable { 

    @EJB 
    private BooksFacadeLocal bFL; 
    @EJB 
    private CategoriesFacadeLocal cFL; 

    private String search; 
    private Categories searchCategory; 

    /** 
    * Creates a new instance of SearchProviderBean 
    */ 
    public SearchProviderBean() { 
    } 

    public List<Categories> getCategories() { 
     List<Categories> result = cFL.findAll(); 

     return result; 
    } 

    public Categories getSearchCategory() { 
     FacesContext fc = FacesContext.getCurrentInstance(); 
     for(Categories cat : this.cFL.findAll()) 
     { 
      if(cat.getName().equalsIgnoreCase(getParam(fc, "category"))) 
      { 
       this.searchCategory = cat; 
      } 
     } 
     return this.searchCategory; 
    } 

    public void setSearchCategory(Categories searchCategory) { 
     this.searchCategory = searchCategory; 
    } 

    public String launchSearch() { 
     String cat = ""; 
     if(!this.searchCategory.getName().equalsIgnoreCase("Toutes Catégories")) 
     { 
      cat = "category=" + this.searchCategory.getName(); 
     } 
     return "/catalog.xhtml?faces-redirect=true&search=" + search + cat; 

    } 

    public String getSearch() { 
     FacesContext fc = FacesContext.getCurrentInstance(); 
     String searchParam = getParam(fc , "search"); 
     if(searchParam != null) 
     { 
      this.search = searchParam; 
     } 

     return search; 
    } 

    public void setSearch(String search) { 
     this.search = search; 
    } 

    public Categories getDefaultCategorySearch() 
    { 
     Categories def = new Categories(); 
     def.setName("Toutes Catégories"); 
     return def; 
    } 

    public List<Books> getSearchResults() { 
     return null; 
    } 

    public List<Books> getAllBooks() 
    { 
     return this.bFL.findAll(); 
    } 

    private String getParam(FacesContext fc, String paramName) 
    { 
     return fc.getExternalContext().getRequestParameterMap().get(paramName); 
    } 

} 

Тогда проблемы:

  • Методы setSearch(String search) и setSearchCategory(Categories searchCategory) никогда не вызываются (проверяется с помощью контрольных точек)

  • Метод действия commandLink никогда не вызывается (проверяются с помощью точки останова на оператора возврата) и только перезагружает страницу.

Я пытался не изменить commandLink к CommandButton: никакого эффекта, кроме изменения стиля я попытался изменить @ViewScoped аннотацию к @SessionScoped, но никакого эффекта

EDIT:

Из-за размера полной страницы и потому, что я совершенно новичок в jsf, я не видел сообщение об ошибке, отображаемое в нижней части страницы, в котором говорилось, что произошла ошибка, преобразующая значение com.booXtore.domain.Category[ id=X ] для нулевого преобразователя

+1

Похоже, что есть проблемы преобразования. Добавьте '', чтобы проверить любое преобразование или другую ошибку, которая происходит до фазы обработки. –

+0

На самом деле проблема с конверсией, я просто не вижу ошибки, я совершенно новичок в JSF, и у меня нет привычки смотреть на мой браузер на наличие ошибок. Ошибка в отредактированном сообщении. Любые идеи о том, как исправить это? – Sidewinder94

ответ

0

Найдено ответа.

Мне просто нужен конвертер для моего объекта. На данный момент мой класс предлагает метод ToString(), который позволяет отображать только пользовательский объект.

Из того, что я понял, проблема заключалась в том, что для сохранения состояния объекта. Элемент Je JSF попытался сохранить текстовое представление моего объекта. К сожалению, установленный метод атрибута не принял тип String в аргументе, но тип Категории.

Мне пришлось создать класс конвертера, который позволил мне автоматически конвертировать мой объект в один путь в другой (текст < -> объект).

Вот код, я использовал:

package com.booXtore.converters; 

import com.booXtore.domain.Categories; 
import com.booXtore.service.CategoriesFacadeLocal; 
import javax.ejb.EJB; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

/*The converter class has to be annotated and identified*/ 
@FacesConverter("com.booXtore.converters.CategoriesConverter") 
public class CategoriesConverter implements Converter{ 

    @EJB 
    private CategoriesFacadeLocal cFL; 

    /*The method who will return an object based on the string passed by the JSF component*/ 
    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     if((value != null) || (Integer.parseInt(value) == -1)) 
     { 
      Integer id = Integer.parseInt(value); 
      return cFL.find(id); 
     } 
     Categories cat = new Categories(); 
     cat.setName("Toutes Catégories"); 
     return cat; 
    } 

    /*THe method wich will return the String that will represent the object*/ 
    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     Categories cat = (Categories)value; 
     if(cat.getName().equals("Toutes Catégories")) 
     { 
      return "-1"; 
     } 
     else 
     { 
      return cat.getId().toString(); 
     } 
    } 

} 

я также должен был добавить <f:converter converteedId="com.booXtore.converters.CategoriesConverter"/> в <h:selectOneMenu> компонент зарегистрировать преобразователь.

Для возможно более ясного учебника и полный примера здесь является сайт которым мне очень помогли: Custom Converter in JSF

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