2012-02-23 48 views
1

如果有人能够帮助我摆脱空指针异常,试图将无状态会话Bean注入EntityHome派生类。将无状态会话bean注入到Seam 2.2中的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; 
    . 
    . 
    ... 
} 

initaskHome()在TaskHome.java方法将导致空值指针异常

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

在Java EE 5/JSF 1.2中,@EJB注释仅适用于“托管对象”,就像其他EJB或Servlet一样。

由于CategoryService是一个Seam组件,你可以使用@In注射像其他任何Seam组件:

@Name("taskHome") 
public class TaskHome extends EntityHome<Task> { 

    @In 
    private CategoryServiceLocal categoryService; 
相关问题