在 Java 类中注入 EJB 时出现 NullPointerException

2023-12-29

我认为这个问题的出现是因为我没有得到 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, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
                    List<User> users;
                    users = service.findAllUsers();
                    this.setRowCount(users .size());
                    return users ; 
                }
        };
    }
}

是否可以在普通 Java 类中注入 EJB?我必须做什么才能不必在表示模型中定义 DataModel?

Thanks


EJB 仅注入到托管 bean 中。当 bean 由某个注入容器(例如通过 JSF 自己的)管理时,该 bean 就被管理了@ManagedBean, CDI's @Named等等。您甚至可以将一个 EJB 注入另一个 EJB。您无法将 EJB 注入非托管类(但是您可以手动从 JNDI 获取它,但这很丑陋)。

您基本上有以下选择:

  1. In @PostConstruct的托管 bean 中,构建数据模型,从而将结果作为参数传递(请注意,这也是标准数据模型的方式,例如ListDataModel http://docs.oracle.com/javaee/6/api/javax/faces/model/ListDataModel.html work).

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

  2. Make LazyUserDataModel摘要,您要求用户提供结果。

    public abstract class LazyUserDataModel extends LazyDataModel<User> {
    
        @Override
        public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, 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();
        }
    };
    

  3. Make LazyUserDataModel一个托管 bean 以及注入它。

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

    with

    @Inject
    private LazyUserDataModel lazyUsers;
    

  4. 创建一个完整的匿名实例,就像您想象的那样。


无关对于具体问题,没有必要LazyDataModel您据此提供all记录。其目的是让您能够使用 SQL 功能仅请求子集或记录(LIMIT, OFFSET和朋友)基于当前的分页状态,这样您就不需要在 Java 内存中拥有数百甚至数千条记录,而只需十个左右。换句话说,如果你从不使用first and/or pageSize的论点load()方法,你很可能完全错误地接近它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 类中注入 EJB 时出现 NullPointerException 的相关文章

随机推荐