我是编程新手,我的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代码。

09-05 15:29
查看更多