在将无状态会话bean注入Seam 2.2中的EntityHome衍生物之后引发了空指针异常

时间:2012-02-23 10:23:42

标签: java hibernate jpa ejb seam

如果有人可以帮助我摆脱空指针异常,试图将无状态会话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

1 个答案:

答案 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;