Гибернация и весна в приложении Swing - PullRequest
4 голосов
/ 19 мая 2011

Я новичок в программировании. У меня проблемы с приложением Swing. Я полагаю, что-то не так с сеансом. Я использую Hibernate и настраиваю его с помощью Spring. Когда я нажимаю кнопку, я хочу добавить информацию в базу данных, но яget NullPoinerException.Maybe я должен кодировать пользовательский интерфейс другим способом?Нужна ваша помощь! Спасибо.

Вот мой код:

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>

1 Ответ

4 голосов
/ 19 мая 2011

Важно помнить, что Spring может вставлять ссылки только в управляемые bean-компоненты Spring.В вашем коде вы ожидаете, что Spring внедрит экземпляр UserService в ваш Action класс.Spring должен правильно выполнять эту инъекцию в bean-компонент Spring с именем usergui, однако в пользовательском интерфейсе вы создаете свой собственный экземпляр класса Action со следующим кодом:

loginButton.addActionListener(new Action());

Каждый раз, когда вы создаетеэкземпляр Object, он не будет управляться Spring и должен обрабатываться так же, как любой другой объект, управляемый самостоятельно, т. е. устанавливать все необходимые ссылки вручную.

Чтобы получить ожидаемый результат, вам необходимо изменить логику пользовательского интерфейса для ссылки на bean-компонент Spring usergui, который вы определили в своем файле конфигурации.Чтобы получить этот экземпляр, сначала нужно получить экземпляр BeanFactory'. Here is an example of how your code can look to retrieve the correct instance of usergui` Spring:

// 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, без необходимости изменения кода пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...