2013-12-17 4 views
1

Используя следующий Bean, я заполнить форму со странами:Инъекция ДАО дают NullPointerException

@ManagedBean 
@RequestScoped 
public class CreateUser { 

    @EJB 
    private ParticipantDAO participantDAO; 
    @EJB 
    private CountryDAO countryDAO; 
    private List<Country> countries = new ArrayList<Country>(); 
    . . . 
    . . . 
    . . . 

    @PostConstruct 
    public void init() { 
     countries = countryDAO.getAllCountries(); 
    } 

В форме я использовать конвертер:

<h:selectOneMenu id="country" value="#{createUser.user.country}" required="true" requiredMessage="Please select a country." converter="#{countryConverter}" > 
     <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> 
     <f:selectItems value="#{createUser.countries}" var="country" itemValue="#{country}" itemLabel="#{country.country}" /> 
</h:selectOneMenu> 

Преобразователь дать NullPointerException кажется потому что он не может ввести CountryDAO:

@ManagedBean 
@RequestScoped 
@FacesConverter(forClass = Country.class) 
public class CountryConverter implements Converter { 

@EJB 
private CountryDAO countryDAO; 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (!(value instanceof Country)) { 
     return null; 
    } 

    return String.valueOf(((Country) value).getId()); 
} 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    if (value == null || value.isEmpty()) { 
     return null; 
    } 
    try { 
     System.out.println("Converter Value: " + value); 
     Country c = countryDAO.find(Long.valueOf(value)); 
     System.out.println("Converter: " + c.getCountry()); 
     return c; 
    } catch (Exception e) { 
     throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to Country %s %d", value, e.toString(), Long.valueOf((value)))), e); 
    } 
} 
} 

В консоли я вижу «Преобразованный валу e ", но не" CountryDAO find ", который должен быть напечатан методом createDAO.find.

@Stateless 
@LocalBean 
public class CountryDAO { 

public CountryDAO() { 
} 
@PersistenceContext 
private EntityManager em; 
@Resource 
SessionContext context; 

public List<Country> getAllCountries() { 
    TypedQuery<Country> query = em.createNamedQuery(Country.FIND_ALL, Country.class); 
    return query.getResultList(); 
} 

public Country find(Long id) { 
    System.out.println("CountryDAO find"); 
    Country c = em.find(Country.class, id); 
    System.out.println(c.getCountry()); 
    return c; 
} 

Я попробовал решение сообщалось о Inject a EJB into a JSF converter with JEE6 (я не знаю, если я ставлю код в нужное место). Я положил его в конвертере (и я получить NullPointerException):

@ManagedBean 
@FacesConverter(forClass = Country.class) 
public class CountryConverter implements Converter { 

// @EJB 
// private CountryDAO countryDAO; 
private InitialContext ic; 
private CountryDAO countryDAO; 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (!(value instanceof Country)) { 
     return null; 
    } 

    return String.valueOf(((Country) value).getId()); 
} 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    if (value == null || value.isEmpty()) { 
     return null; 
    } 
    System.out.println("Converter Value: " + value); 
    try { 
     try { 
      ic = new InitialContext(); 
      countryDAO = (CountryDAO) ic.lookup("java:global/DAO/CountryDAO"); 
     } catch (NamingException e) { 
     } 

     Country c = countryDAO.find(Long.valueOf(value)); 
     System.out.println("Converter: " + c.getCountry()); 
     return c; 
    } catch (Exception e) { 
     throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to Country %s %d", value, e.toString(), Long.valueOf((value)))), e); 
    } 
} 
+0

Я добавить конвертер для граней-конфигурации, как объяснить http://stackoverflow.com/questions/3630403/how-do-i- доступа EJB-боб когда-внутри-а-заказ преобразователь. –

ответ

3

У меня была та же проблема, в какой-то другой проект, где я использую конвертер для некоторых primefaces компонента. Я решил проблему с CDI.

Все, что вам нужно сделать, это аннотировать класс конвертера с помощью @Named (и вводить класс DAO через @Inject (JEE6), а не с JEE5 - @EJB).

Вы ссылаться на ваш конвертер с обязательным атрибутом, как: <f:converter binding="#{countryConverter}" />

+0

Спасибо, что работает отлично. –

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