Bean не получает инъекцию в EJB 3.1, только этот bean имеет такое поведение - PullRequest
2 голосов
/ 11 октября 2011

1 и JSF 2.0 + простые лица, что круто: D

И у меня есть этот валидатор, но я не могу правильно ввести в него блок персистентности.

Все остальные бины работают нормально, это единственный, который не работает, он дает мне Nullpointer на roleFacade

Это незаконно вводить в валидаторе? это слишком рано в жизненном цикле? что это может быть?

Спасибо!

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;


@FacesConverter("rolesConverter")
@Stateless
public class RolesConverter implements Converter{

@EJB
private RoleFacade roleFacade;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Roles role = null;
        if ((value != null) && (!value.equals(""))) {       
             role = roleFacade.find(Long.valueOf(value));       
        }
        return role;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
        Integer retorno = null;
        if (!(value == null)) {
            Roles role = new Roles();
            role = (Roles) value;
            retorno = role.getId();
        }
        return retorno.toString();
}

}

И Фасад

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Stateless
public class RoleFacade extends AbstractFacade<Roles> {


@PersistenceContext(unitName = "br.com.cflex.itm-PU", type= PersistenceContextType.TRANSACTION)    
private EntityManager em;

private static Logger log = LoggerFactory.getLogger(RoleFacade.class);

@Override
protected EntityManager getEntityManager() {
    return em;
}

public RoleFacade() {
    super(Roles.class);
}

public RoleFacade(EntityManager em) {
    super(Roles.class);
    this.em = em;
}

public List<Roles> getListOfRoles(){
    log.debug("Calling method 'RoleFacade: List getListOfRoles()'");
    List<Roles> list = getEntityManager().createNamedQuery("Roles.findAll").getResultList();        
   return list;
}

}

Ответы [ 6 ]

5 голосов
/ 12 октября 2011

Вы можете сделать это, вы просто делаете это неправильно.

Попробуйте это:

import java.io.Serializable;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.enterprise.context.RequestScoped
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.inject.Named;


@Named("rolesConverter")
@RequestScoped
public class RolesConverter implements Converter, Serializable {

@EJB
private RoleFacade roleFacade;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Roles role = null;
        if ((value != null) && (!value.equals(""))) {       
             role = roleFacade.find(Long.valueOf(value));       
        }
        return role;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
        Integer retorno = null;
        if (!(value == null)) {
            Roles role = new Roles();
            role = (Roles) value;
            retorno = role.getId();
        }
        return retorno.toString();
}

И в вашем xhtml используйте converter="#{rolesConverter}".Конечно, я предполагаю, что вы используете CDI.

И, кстати, PrimeFaces - это круто.:)

2 голосов
/ 12 октября 2011

Еще один вопрос, который вы должны задать себе: это правильный принцип проектирования, чтобы преобразователь для просмотра в базе данных?Мой ответ: точно нет.Вид связан с моделью.Отложите поиск реального объекта до тех пор, пока вы не внесете изменения в БД (на уровне персистентности).

1 голос
/ 12 октября 2011

Вы слышали о CODI?

@ Расширенные аннотации делают свое дело.

https://cwiki.apache.org/confluence/display/EXTCDI/JSF+Usage

1 голос
/ 11 октября 2011

В соответствии со спецификацией платформы Java EE 6, таблица EE.5-1, внедрение поддерживается только для классов управляемых компонентов JSF, но не для других классов JSF.

0 голосов
/ 23 июля 2014
  1. Keep @ FaceConverter.
  2. Выполните поиск в конструкторе.

    try {
        InitialContext ctx = new InitialContext();
        MyInterface myInstance = (MyInterface) ctx.lookup("java:module/MyEJB");
    } catch (NamingException e) {
        log.error(e.getMessage());
    }
    
0 голосов
/ 26 марта 2013

Может быть, вы думаете, что это не по теме. Однако, как веб-разработчик, использующий большинство (но не все) фреймворков, пожалуйста, держитесь подальше от JSF. Это должно быть наименее продуктивным и самым трудоемким из когда-либо созданных адских рамок. Вы хотите добиться результатов? Узнайте Ext JS с REST. Может быть, не подходит для всех приложений, но стоит многим .. Пожалуйста, примите это как дружеский совет, не пытаясь никого оскорбить.

...