Используя следующий 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);
}
}
Я добавить конвертер для граней-конфигурации, как объяснить http://stackoverflow.com/questions/3630403/how-do-i- доступа EJB-боб когда-внутри-а-заказ преобразователь. –