Bean没有在EJB 3.1中注入,只有这个bean有这种行为

时间:2011-10-10 20:56:34

标签: java dependency-injection ejb ejb-3.0 ejb-3.1

1和JSF 2.0 +的表面很酷:D

我有这个验证器,但我无法正确地注入持久性单元。

所有其他bean正常工作,这是唯一没有的,它在roleFacade

给了我一个Nullpointer

注入验证器是否违法?是否在生命周期中过早?它能成为什么?

谢谢!

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 个答案:

答案 0 :(得分:5)

你可以做到,你只是做错了。

试试这个:

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很棒。 :)

答案 1 :(得分:2)

您必须问自己的另一个问题是:让转换器查看数据库是否是正确的设计原则?我的回答:绝对不是。视图与模型捆绑在一起。推迟查找真实对象,直到对DB进行更改(在持久层中)。

答案 2 :(得分:1)

根据Java EE 6平台规范表EE.5-1,仅支持JSF托管bean类,而不支持其他JSF类。

答案 3 :(得分:1)

你听说过CODI吗?

@Advanced注释可以解决问题。

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

答案 4 :(得分:0)

也许你认为这不是主题。但是,作为使用大多数(并非所有)框架的Web开发人员,请远离JSF。这必定是有史以来最耗时的最耗时的地狱框架。你想结果吗?通过REST学习Ext JS。也许不适合所有的应用程序,但对许多人来说是值得的..请认为这是友好的建议,无意侮辱任何人。

答案 5 :(得分:0)

  1. 保留@FaceConverter。
  2. 在构造函数中进行查找。

    try {
        InitialContext ctx = new InitialContext();
        MyInterface myInstance = (MyInterface) ctx.lookup("java:module/MyEJB");
    } catch (NamingException e) {
        log.error(e.getMessage());
    }