2011-05-19 101 views
4

我在programming.I一個新手在我的揮杆application.I問題想什麼毛病session.I使用Hibernate和Spring.When來配置它,我按按鈕,我想添加信息到數據庫,但我得到NullPoinerException.Maybe我必須以另一種方式編碼用戶界面? 需要你的幫助!謝謝。Hibernate和在Swing應用程序春天

這裏我的代碼:

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(); 
    } 
} 

Action.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> 
+0

可你也發表您的揮杆方面的文件? – 2011-05-19 11:45:52

+0

@El刮破的beans.xml在bean ID「userDAO的」 – andre 2011-05-19 12:04:25

+0

我看到裁判名爲「SessionFactory的」豆,你在哪裏聲明豆?你能夠調試這個代碼嗎?如果是這樣,那麼NullPointerException究竟是什麼?它是sessionFactory對象嗎? sessionFactory返回的是會話嗎? – 2011-05-19 12:40:55

回答

4

與春季記住的重要一點是,進入春季管理的bean只能注入引用。在你的代碼中,你期待Spring會爲你的Action類注入一個UserService的實例。春季應正確執行此注入到名爲usergui春豆,但是,在你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的時候,你想用的一類,而不是類本身(Action)實現的接口(ActionListener)進行交互。通過這樣做,您可以更改bean usergui所引用的實現,例如Action - > DifferentAction,而無需修改您的UI代碼。

+0

時,NPE很可能被'Action'拋出了!非常感謝!你真的幫了我! – andre 2011-05-19 16:40:29

+0

@Kris的Babis嗨,我面臨着同樣的問題,你可以請幫助我,我問在這個網站的一個問題:「如何使用Spring IOC與Swing」如果可能的話,請幫助我。 – Balasaheb 2012-06-05 12:19:16

相關問題