2012-05-15 4 views
0

У меня есть следующие ApplicationScoped бобаВставьте фасоль в конвертер

package es.caib.gesma.gesman.data; 

import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

import es.caib.gesma.gesman.ejb.Dao; 

@ManagedBean(name="priorityList") 
@ApplicationScoped 
public class PriorityList { 

    @EJB 
    Dao daoEjb; 

    private List<Priority> priorities = null; 

    public PriorityList() { 
    } 

    @PostConstruct 
    public void refresh() { 
     this.priorities = daoEjb.findPriorities(); 
    } 

    public List<Priority> getPriorities() { 
     return this.priorities; 
    } 

    public Priority fromId(int id) { 
     for(Priority priority : this.priorities) { 
     if (priority.getId() == id) { 
      return priority; 
     } 
     } 
     return null; 
    } 
    } 

Я стараюсь привнести что боб внутри конвертера

package es.caib.gesma.gesman.data.converter; 

import javax.faces.application.FacesMessage; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.ConverterException; 

import es.caib.gesma.gesman.data.Priority; 
import es.caib.gesma.gesman.data.PriorityList; 

@ManagedBean 
@ApplicationScoped 
public class PriorityConverter implements Converter { 

    @ManagedProperty("#{priorityList}") 
    private PriorityList priorityList; 

    @Override 
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) { 
    ... 
    } 

    @Override 
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) { 
    ... 
    } 

    public void setPriorityList(PriorityList priorityList) { 
    System.out.println("SET PRIORITYLIST " + priorityList); 
    this.priorityList = priorityList; 
    } 

} 

Всякий раз, когда я пытаюсь получить доступ к собственности, оно равно нулю. Сеттер никогда не вызывается.

От this question и this one, похоже, что невозможно вводить бобы обычным способом (пожалуйста, поправьте меня, если я ошибаюсь). Существует ли какая-либо альтернатива, поэтому я не могу каждый раз получать весь список значений из EJB (= доступ к базе данных)?

ответ

0

Я думаю, что вы должны быть в состоянии вытащить этот компонент из HttpSession (это работает для меня в PhaseListener с SessionScoped боба)

FacesContext context = FacesContext.getCurrentInstance(); 
HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
SessionForm sessionBean = (SessionForm) session.getAttribute("priorityList"); 

Или, если я могу одолжить статью из BalusC о JSF communication, на дне описано, как сделать конвертер из ManagedBean (чтобы вы могли легко вводить свой компонент ApplicationScoped там)

+0

Закрыть. Это обработанный приложением компонент, поэтому мне пришлось использовать 'FacesContext.getCurrentInstance(). GetExternalContext(). GetApplicationMap(). Get (" priorityList ")' – SJuan76

1

Вы не можете (в настоящее время) вводить зависимости в конвертеры. Однако, если вы можете использовать Seam 3, модуль seam-faces включит это. Вам не нужно делать что-либо особенное, просто создайте маски JAR (и любые ее зависимости) в пути к классам и впрыскивайте их в конвертеры. Просто следите за другими непредвиденными побочными эффектами (я заметил различия в границах транзакций, когда JAR-стойкость JAR находится в пути к классам).

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