我认为这个问题提高了,因为我没有得到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参数,那么你最有可能完全错误.