【发布时间】:2018-07-10 21:17:02
【问题描述】:
我正在学习 Spring 框架并使用 DAO。当我使用我的 dao.save 方法将新对象持久保存到数据库时,我得到了 NullPointerException。我该如何解决这个问题并正确地将对象持久化/删除/更新到数据库?谢谢。
实体Coffee.class:
@Entity
public class Coffee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String coffeeName;
private Integer costForCup;
private boolean isDisabled;
@OneToMany(mappedBy = "coffee")
private Set<Coffee> coffee;
public Coffee() {}
public Coffee(String coffeeName, Integer costForCup, boolean isDisabled) {
this.coffeeName = coffeeName;
this.costForCup = costForCup;
this.isDisabled = isDisabled;
}
*getters and setters*
CoffeeDAO:
public interface CoffeeDAO {
public Coffee findById(Long id);
public List<Coffee> findAll();
public void createCoffee(Coffee coffee);
}
CoffeeDAOImpl:
public class CoffeeImplementation implements CoffeeDAO {
private HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory){
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
***
@Override
@Transactional
public void createCoffee(Coffee coffee) {
hibernateTemplate.save(coffee);
}
}
OrderBean.class:
@ManagedBean
@SessionScoped
public class OrderBean {
@Autowired
private CoffeeDAO coffeeDAO;
public boolean createCoffee(){
Coffee coffee = new Coffee("Кофе", 4, true);
System.out.println(coffee.getCoffeeName()+" " + coffee.getCostForCup() + " " + coffee.isDisabled());
coffeeDAO.createCoffee(coffee);
return true;
}
错误日志:
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
... 32 more
Caused by: java.lang.NullPointerException
at javacoff.beans.OrderBean.createCoffee(OrderBean.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:329)
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:342)
at org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58)
at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
... 33 more
【问题讨论】:
-
根据您发布的代码,您似乎希望将 CoffeeDAO 接口的实现注入
OrderBean。您是否可能需要在CoffeeImplementation中添加适当的注释,例如@Repository,例如:@Repository("coffeeDAO")。这将允许您的 DI 容器(Spring?)自动连接 coffeeDAO。 -
我像
@Repository("coffeeDAO") public class CoffeeImplementation implements CoffeeDAO这样添加这个注释,但它没有帮助。还是一样的 NullPointerException 错误。 -
如果您可以添加所有代码,将会很有帮助。但是,还有一件事要尝试:在
@Autowired注释之前或之后添加注释@Qualifier("coffeeDAO")。这明确地告诉您的容器(Spring)用于执行自动装配的 bean 的名称。此外,Spring 必须知道包含注释 bean 的包(OrderBean和CoffeeImplementation),并允许 Spring 将 bean 加载到 DI 容器中。见:docs.spring.io/spring/docs/current/javadoc-api/org/…