如果有人可以帮助我摆脱空指针异常,试图将无状态会话bean注入到EntityHome派生类中,我将不胜感激。
@Name("taskHome")
public class TaskHome extends EntityHome<Task> {
@In(create = true)
CategoryHome categoryHome;
@In
User user;
@EJB
private CategoryServiceLocal categoryService;
private Category newcategory;
private List<Category> categories = new ArrayList<Category>();
private List<Category> parentCategories = new ArrayList<Category>();
@PostConstruct
public void initaskHome() {
categories = categoryService.findAll();
parentCategories = categoryService.getParentCategories();
}
public void setTaskId(Long id) {
setId(id);
}
public Long getTaskId() {
return (Long) getId();
}
}
这是会话bean的来源:
@Name("categoryService")
@AutoCreate
@Stateless
public class CategoryService extends AbstractFacade<Category> implements CategoryServiceLocal {
@PersistenceContext
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public CategoryFacade() {
super(Category.class);
}
public List<Category> findAll() {
return em.createQuery("select object(c) from Category as c").getResultList();
}
public List<Category> getParentCategories() {
return em.createNamedQuery("Category.findParents").getResultList();
}
}
的 Category.java 的
@Entity
@NamedQueries({
@NamedQuery(name = "Category.findAll", query = "SELECT c FROM Category c"),
@NamedQuery(name = "Category.findParents", query = "SELECT c FROM Category c WHERE c.parentCategory = null"),
@NamedQuery(name = "Category.findByName", query = "SELECT c FROM Category c WHERE c.name = :name")})
public class Category implements java.io.Serializable {
private static final long serialVersionUID = -5850085199769631170L;
private Short id;
private Byte version;
private Category parentCategory;
private String name;
private String color;
.
.
...
}
TaskHome.java方法中的 initaskHome()会导致空指针异常
Caused by: org.jboss.seam.InstantiationException: Could not instantiate Seam component: taskHome
at org.jboss.seam.Component.newInstance(Component.java:2170)
at org.jboss.seam.Component.getInstance(Component.java:2024)
at org.jboss.seam.Component.getInstance(Component.java:1986)
at org.jboss.seam.Component.getInstance(Component.java:1980)
at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:55)
at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:50)
at org.jboss.seam.el.SeamELResolver.resolveBase(SeamELResolver.java:148)
at org.jboss.seam.el.SeamELResolver.getValue(SeamELResolver.java:51)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
at org.jboss.el.parser.AstIdentifier.getValue(AstIdentifier.java:44)
at org.jboss.el.parser.AstValue.getValue(AstValue.java:63)
at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
at org.jboss.seam.core.Expressions$1.getValue(Expressions.java:156)
at org.jboss.seam.navigation.Param.getStringValueFromModel(Param.java:154)
at org.jboss.seam.navigation.Pages.getStringValuesFromModel(Pages.java:764)
at org.jboss.seam.navigation.Pages.encodePageParameters(Pages.java:939)
at org.jboss.seam.faces.FacesManager.redirect(FacesManager.java:176)
at org.jboss.seam.faces.Redirect.execute(Redirect.java:154)
at org.jboss.seam.faces.Redirect.returnToCapturedView(Redirect.java:171)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:335)
... 71 more
Caused by: java.lang.NullPointerException
at net.ozar.todo.session.TaskHome.initaskHome(TaskHome.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144)
at org.jboss.seam.Component.callComponentMethod(Component.java:2275)
at org.jboss.seam.Component.callPostConstructMethod(Component.java:2222)
at org.jboss.seam.intercept.JavaBeanInterceptor$1.proceed(JavaBeanInterceptor.java:133)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
at org.jboss.seam.intercept.Interceptor.postConstruct(Interceptor.java:194)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:74)
at org.jboss.seam.intercept.Interceptor.postConstruct(Interceptor.java:194)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:74)
at org.jboss.seam.intercept.Interceptor.postConstruct(Interceptor.java:194)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:74)
at org.jboss.seam.intercept.Interceptor.postConstruct(Interceptor.java:194)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:74)
at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
at org.jboss.seam.intercept.RootInterceptor.invokeAndHandle(RootInterceptor.java:84)
at org.jboss.seam.intercept.JavaBeanInterceptor.callPostConstruct(JavaBeanInterceptor.java:138)
at org.jboss.seam.intercept.JavaBeanInterceptor.postConstruct(JavaBeanInterceptor.java:117)
at org.jboss.seam.Component.postConstructJavaBean(Component.java:1463)
at org.jboss.seam.Component.postConstruct(Component.java:1379)
at org.jboss.seam.Component.newInstance(Component.java:2155)
... 95 more
答案 0 :(得分:1)
在Java EE 5 / JSF 1.2中,@EJB
注释仅适用于“托管对象”,与其他EJB或Servlet一样。
由于CategoryService是Seam组件,因此您可以像使用任何其他Seam组件一样使用@In
进行注入:
@Name("taskHome")
public class TaskHome extends EntityHome<Task> {
@In
private CategoryServiceLocal categoryService;