1

Swingを使用してデスクトップアプリケーションを開発していますが、これではSpringフレームワークを使用してIOCを使用し、インターフェイス技術を使用して実行したいと考えています。しかし、インターフェイスのインスタンスによって関数を呼び出し、そのインターフェイスが呼び出された関数が宣言されているクラスによって実装されている場合、nullPointerExceptionが発生します。

これが私の簡単なアプリコードです:

インターフェース:

public interface IEmpMasterService {    
    public InternalResultsResponse<EmpMaster> maintainEmpMaster(
            EmpMaster empMaster);
}

実装者クラス:

public class EmpMasterService implements IEmpMasterService {    
    private IEmpMasterDAO empMasterDAO; 
    public IEmpMasterDAO getEmpMasterDAO() {
        return empMasterDAO;
    }
    public void setEmpMasterDAO(IEmpMasterDAO empMasterDAO) {
        this.empMasterDAO = empMasterDAO;
    }
    @Override
    public InternalResultsResponse<EmpMaster> maintainEmpMaster(
            EmpMaster empMaster) {
        InternalResultsResponse<EmpMaster> response = new InternalResultsResponse<EmpMaster>();
        //some logic her...
        response = getEmpMasterDAO().maintainEmpMaster(request);
        return response;
    }}

DAOインターフェース:

public interface IEmpMasterDAO {
    InternalResultsResponse<EmpMaster> maintainEmpMaster(
            EmpMasterRequest request);
}
class Implementing DAO:
public class EmpMasterDAO extends HibernateDaoSupport implements IEmpMasterDAO{
    @Override
    public InternalResultsResponse<EmpMaster> maintainEmpMaster(
            EmpMasterRequest empMasterRequest) {
//hibernate code goes here...       
        return resultsResponse;
    }
} 

メインクラス:

public class EmpManager extends javax.swing.JFrame {    
    private IEmpMasterService empMasterService;
    private static ApplicationContext context;  
    public IEmpMasterService getEmpMasterService() {
        return empMasterService;
    }
    public void setEmpMasterService(IEmpMasterService empMasterService) {
        this.empMasterService = empMasterService;
    }
public static void main(String args[]) {
        context = new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});
empMasterService = (EmpMasterService)context.getBean("empMasterService");
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        String name = jTextField1.getText();
        String salary = jTextField2.getText();
        EmpMaster empMaster = new EmpMaster();
        empMaster.setEmpName(name);
        empMaster.setSalary(Double.parseDouble(salary));  
//***** getting Error at this line *****//    
        InternalResultsResponse<EmpMaster> response = getEmpMasterService().maintainEmpMaster(empMaster);       
    }

私のApplicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <import resource="dataSource.xml"/>
       <bean id="mainFrame" class="org.UI.EmpManager">
        <property name="title"> <value>Spring Example</value></property>    
        <property name="empMasterService" ref="empMasterServiceImpl"></property>    
    </bean>     
    <bean id="empMasterServiceImpl" class="org.service.EmpMasterService">
        <property name="empMasterDAO" ref="empMasterDAOTarget"></property>      
    </bean> 
    <bean id="empMasterDAOTarget" class="org.DAO.EmpMasterDAO">
        <property name="hibernateTemplate" ref="matrixHibernateTemplate"/>
    </bean> 
</beans>

そして、ボタンをクリックすると、エラーが発生します。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at org.UI.EmpManager.jButton1ActionPerformed(EmpManager.java:140)
    at org.UI.EmpManager.access$0(EmpManager.java:132)
    at org.UI.EmpManager$1.actionPerformed(EmpManager.java:67)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
4

2 に答える 2

2

EmpManagerをどのように作成していますか。マネージャーのアプリケーションxmlにBeanがありますが、これにはmainメソッドも含まれています。次に、メインメソッド内でアプリケーションコンテキストを取得し、サービスBeanを設定するため、EmpManagerBeanはアプリケーションコンテキストで何も実行しません。

mainメソッドを別のクラスに抽出することをお勧めします。このクラスでは、アプリケーションコンテキストをロードし、UIマネージャーでのみgetBeanを使用します。現在設定している方法では、Springに任せるのではなく、アプリケーションコンテキストからBeanを直接取得することにより、Springの多くのIoC機能を無視します。

これは問題を直接解決しないかもしれませんが、少なくともSpringが単一のエントリポイントを持ち、DIを自分で設定するのではなく、Springの手に委ねることができます。

于 2012-06-05T13:23:53.663 に答える
0

コードに何かが欠けています。

投稿したメイン関数は、Swingフレームの作成を呼び出しません。それは本当にあなたが呼んでいるコードですか?

次に、Bean名に不一致があり、xmlではBeanの名前が付けられempMasterServiceImplており、コードでは。を使用していますempMasterService。うまくいかないだろう。

于 2012-06-05T09:43:47.780 に答える