我是编程新手,我的Swing应用程序中有问题,我认为会话有问题,我使用Hibernate并通过Spring对其进行配置。当我按下按钮时,我想向数据库中添加信息,但出现NullPoinerException。也许我必须以其他方式编写用户界面代码?
需要您的帮助!
这是我的代码:
MainFrame.java
public class MainFrame extends JFrame {
public MainFrame(){
setTitle("Title");
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
makeButtons();
setVisible(true);
}
public void makeButtons(){
JPanel panel=new JPanel();
panel.add(makeLoginField());
panel.add(makeLoginButton());
panel.add(makePassField());
panel.setVisible(true);
this.add(panel);
}
public JButton makeLoginButton(){
JButton loginButton=new JButton("Login");
loginButton.addActionListener(new Action());
return loginButton;
}
public JTextField makeLoginField(){
JTextField loginField=new JTextField();
loginField.setSize(new Dimension(134, 20));
return loginField;
}
public JPasswordField makePassField(){
JPasswordField passField=new JPasswordField();
passField.setSize(new Dimension(134, 20));
return passField;
}
public static void main(String[] args) {
JFrame m=new MainFrame();
}
}
动作.java
class Action implements ActionListener{
@Autowired
private UserServiceInterface userService;
public void setuserService(UserServiceInterface userService) {
this.userService=userService;
}
public void actionPerformed (ActionEvent e){
User u=new User();
u.setName("HellofromGUI");
userService.addUser(u);
}
}
UserService.java
@Transactional
public class UserService implements UserServiceInterface{
@Autowired
private UserDaoInterface dao;
public void setDao(UserDaoInterface dao) {
this.dao = dao;
}
public void addUser(User u){
dao.insertRow(u);
}
public List getData(){
return dao.getDBValues();
}
}
UserDao.java
public class UserDao implements UserDaoInterface{
@Autowired
private SessionFactory sessionFactory;
public void insertRow(User user) {
Session session = null;
session = sessionFactory.getCurrentSession();
session.save(user);
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public List getDBValues() {
Session session = sessionFactory.getCurrentSession();
List<User> users = session.createCriteria(User.class).list();
return users;
}
}
beans.xml
<beans>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="userdao" class="dao.UserDao">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="userservice" class="service.UserService">
<property name="dao">
<ref bean="userdao" />
</property>
</bean>
<bean id="paymentdao" class="dao.PaymentDao">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="paymentservice" class="service.PaymentService">
<property name="dao">
<ref bean="paymentdao" />
</property>
</bean>
<bean id="usergui" class="ui.Action">
<property name="userService">
<ref bean="userservice" />
</property>
</bean>
</beans>
最佳答案
使用Spring时要记住的重要一点是,它只能将引用注入到Spring托管的bean中。在您的代码中,您期望Spring将UserService
实例注入到Action
类中。 Spring应该正确地将此注入到名为usergui
的Spring bean中,但是,在您的UI中,您将使用以下代码创建自己的Action
类实例:
loginButton.addActionListener(new Action());
每当您自己创建对象的实例时,Spring都不会对其进行管理,因此需要像对待任何自助对象一样对待它,即,手动设置所有必需的引用。
为了获得预期的结果,您需要更改UI逻辑以引用您在配置文件中定义的Spring
usergui
bean。为了获得该实例,首先需要检索Spring的BeanFactory'. Here is an example of how your code can look to retrieve the correct instance of
usergui`的实例:// using ClassPathResource, you can also use a FileResource or other method to load config
Resource res = new ClassPathResource("/beans.xml");
// initialize bean factory
BeanFactory factory = new XmlBeanFactory(res);
// retrieve Spring managed Action class
ActionListener action = factory.getBean("usergui", ActionListener.class);
// configure login button
loginButton.addActionListener(action);
该示例代码引用了ActionListener而不是直接引用Action类。通常,在使用Spring时,您想与由类实现的接口(
ActionListener
)交互,而不是与类本身(Action
)交互。这样做允许您更改bean usergui
引用的实现,例如,Action-> DifferentAction,而无需修改UI代码。