在Java类中注入EJB时,NullPointerException异常

前端之家收集整理的这篇文章主要介绍了在Java类中注入EJB时,NullPointerException异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为这个问题提高了,因为我没有得到EJB的东西.我的实体有一个服务类,这是@Stateless.当我使用@EJB在我的会话作用域演示模型中使用它,一切都可以.但是现在我想在一个DataModel中使用这个EJB服务,我已经在我的演示文稿模型中被覆盖了:
public class LazyUserDataModel extends LazyDataModel<User> {

    @EJB
    private UserService service;

    @Override
    public List<User> load(int first,int pageSize,String sortField,SortOrder sortOrder,Map filters) {
        List<User> users;
        users= service.findAllUsers();
        this.setRowCount(users.size());
        return users; 
    }
}

在执行时,我在“users = service.findAllUsers()”位置得到一个NullPointerException当我在演示文稿模型中覆盖此DataModel时,同样的工作:

@Named
@SessionScoped
public class UserPM {
    @EJB
    private UserService service;

    private LazyDataModel<User> lazyUsers;

    public UserPM() {

            // Don't works
            //lazyUsers = new LazyUserDataModel();

            lazyUsers = new LazyDataModel() {
            @Override
                public List<User> load(int first,Map filters) {
                    List<User> users;
                    users = service.findAllUsers();
                    this.setRowCount(users .size());
                    return users ; 
                }
        };
    }
}

是否可以在普通Java类中注入EJB?我该怎么做,我不必在演示模型中定义DataModel?

谢谢

解决方法

EJB只注入受管Bean. bean由一些注入容器管理,例如通过JSF自己的@ManagedBean,CDI的@Named等进行管理.您甚至可以在另一个EJB中注入EJB.您不能在非托管类中注入EJB(但是您可以手动从JNDI抓取它,但这很简单).

您基本上有以下选项:

>在您的托管bean的@PostConstruct中,构造数据模型,从而将结果作为参数传递(注意,这也是标准数据模型如ListDataModel的工作原理).

@PostConstruct
public void init() {
    lazyUsers = new LazyUserDataModel(service.findAllUsers());
}

>使LazyUserDataModel抽象,您可以要求用户提供结果.

public abstract class LazyUserDataModel extends LazyDataModel<User> {

    @Override
    public List<User> load(int first,Map filters) {
        List<User> users;
        users = findAllUsers();
        this.setRowCount(users.size());
        return users ; 
    }

    public abstract List<User> findAllUsers();

}

这样匿名的类就会减少

lazyUsers = new LazyUserDataModel() {
    @Override
    public List<User> findAllUsers() {
        return service.findAllUsers();
    }
};

>使LazyUserDataModel也是托管的bean,并注入它.

@Named @RequestScoped
public class LazyUserDataModel extends LazyDataModel<User> {
    // ...
}

@Inject
private LazyUserDataModel lazyUsers;

>像你想象的那样创建一个完整的匿名实例.

与具体问题无关,没有一个可以提供所有记录的LazyDataModel.它的意图在于,它可以根据当前的分页状态为您提供仅使用sql权限(LIMIT,OFFSET和朋友)的子集或记录,以便您不需要在Java内存中拥有数百个甚至不是数千条记录,只有十个左右.换句话说,如果你从来没有使用load()方法的first和/或pageSize参数,那么你最有可能完全错误.

猜你在找的Java相关文章