Я изучаю Spring framework и использую 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);
}
КофеDAOImpl:
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
Я добавляю эту аннотацию как @Repository("coffeeDAO") public class CoffeeImplementation implements CoffeeDAO, но это не помогает. Все та же ошибка NullPointerException.
Было бы полезно, если бы вы могли добавить весь свой код. Однако можно попробовать еще одну вещь: добавьте аннотацию @Qualifier("coffeeDAO") непосредственно перед или после вашей аннотации @Autowired. Это явно сообщает вашему контейнеру (Spring) имя bean-компонента, который будет использоваться для автоматического подключения. Кроме того, Spring должен знать пакет, содержащий ваши аннотированные bean-компоненты (OrderBean и CoffeeImplementation), и позволяет Spring загружать bean-компоненты в контейнер DI. см .: docs.spring.io/spring/docs/current/javadoc-api/org/…




Решите мою проблему с SpringBeanAutowiringSupport в моем управляемом компоненте: public class OrderBean extends SpringBeanAutowiringSupport.
Судя по опубликованному вами коду, вы ожидаете, что реализация интерфейса CoffeeDAO будет внедрена в
OrderBean. Возможно ли, что вам нужно добавить соответствующую аннотацию, например@Repository, кCoffeeImplementation, например:@Repository("coffeeDAO"). Это позволит вашему контейнеру DI (Spring?) Автоматически подключать coffeeDAO.