0

私はSpring、Hibernateなどを使用するJavaアプリケーションを書いています.Jarにパッケージ化され、コマンドから実行されます。

現在、私のメインクラスは次のようになっています。

public class App
{

    private static final Logger logger = LoggerFactory.getLogger(App.class);


    @Autowired
    private static MemberInquiryService memberInquiryService;


    public static void main(String[] args )
    {
        logger.info("Starting Inquiry Batch Process");

        int pendingRecords = memberInquiryService.getPendingRecordCount();

        logger.info("Current Number Of Pendinig Records (" + pendingRecords + ")");

        logger.info("Ending Inquiry Batch Process");
    }
}

getPendingRecordCount では、テストのために「10」を返すだけです。

public int getPendingRecordCount()
    {


        return 10;
    };

次のエラーが表示されるのはなぜですか。

Exception in thread "main" java.lang.NullPointerException
    at org.XXXX.inquirybatch.app.App.main(App.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

また、ここに私の DatabaseConfig.class があります

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages= { "org.xxxx.inquirybatch", "org.xxxx.core" })
@PropertySource("classpath:application.properties")
public class DatabaseConfig  {


    private static final Logger logger = LoggerFactory.getLogger(DatabaseConfig.class);

    @Autowired
    Environment env;

    @Bean
     public DataSource dataSource()  {

        String serverType = env.getProperty("server.type");

        try {

            if(serverType.equalsIgnoreCase("tomcat"))
            {
                com.mchange.v2.c3p0.ComboPooledDataSource ds = new com.mchange.v2.c3p0.ComboPooledDataSource();

                ds.setDriverClass(env.getProperty("database.driver"));
                ds.setUser(env.getProperty("database.user"));
                ds.setPassword(env.getProperty("database.password"));
                ds.setJdbcUrl(env.getProperty("database.url"));

                return ds;
            }
            else
            {
                Context ctx = new InitialContext();
                return (DataSource) ctx.lookup("java:jboss/datasources/mySQLDB");
            }
        }
        catch (Exception e)
        {
                  logger.error(e.getMessage());
        }

        return null;
     }

    @Bean
    public SessionFactory sessionFactory()
    {

        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
        factoryBean.setHibernateProperties(getHibernateProperties());
        factoryBean.setPackagesToScan(new String[] { "org.xxxx.inquirybatch.model", "org.xxxx.core.model" } );

        try {
            factoryBean.afterPropertiesSet();
        } catch (IOException e) {
            logger.error(e.getMessage());
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }


        return factoryBean.getObject();
    }

    @Bean
    public Properties getHibernateProperties()
    {
        Properties hibernateProperties = new Properties();

        hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
        hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
        hibernateProperties.setProperty("hibernate.use_sql_comments", env.getProperty("hibernate.use_sql_comments"));
        hibernateProperties.setProperty("hibernate.format_sql", env.getProperty("hibernate.format_sql"));
        hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));

        hibernateProperties.setProperty("hibernate.generate_statistics", env.getProperty("hibernate.generate_statistics"));




        hibernateProperties.setProperty("javax.persistence.validation.mode", env.getProperty("javax.persistence.validation.mode"));

        //Audit History flags
        hibernateProperties.setProperty("org.hibernate.envers.store_data_at_delete", env.getProperty("org.hibernate.envers.store_data_at_delete"));
        hibernateProperties.setProperty("org.hibernate.envers.global_with_modified_flag", env.getProperty("org.hibernate.envers.global_with_modified_flag"));

        return hibernateProperties;
    }

    @Bean
    public HibernateTransactionManager hibernateTransactionManager()
    {
        HibernateTransactionManager htm = new HibernateTransactionManager();
        htm.setSessionFactory(sessionFactory());
        htm.afterPropertiesSet();
        return htm;
    }

}
4

3 に答える 3

0

Spring は static フィールドを注入しません。また、アプリケーション コンテキストから取得されたオブジェクト、またはそれ自体が他のオブジェクトに注入されたオブジェクトのみを注入します。

プログラムでアプリケーション コンテキストを作成していないため、Spring はこのプログラムでは何の役割も果たしません。

ドキュメントを読むことをお勧めします。

于 2013-04-05T17:11:09.037 に答える
0

ClassPathXmlApplicationContext から memberInquiryService を取得する必要があります

例えば ​​:-

ApplicationContext context= new ClassPathXmlApplicationContext("spring config.xml");
MmberInquiryService memberInquiryService = context.getBean("memberInquiryService ");

基本的に、コード スニペットの MemberInquiryService は、Spring コンテナーから取得していないため、Spring で管理されていません。また、Spring config.xml で MmberInquiryService エントリを宣言する必要があります。

于 2013-04-05T17:13:48.623 に答える
0

メインクラスを..に変更する必要がありました。

public static void main(String[] args )
    {
        logger.info("Starting Inquiry Batch Process");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        MemberInquiryService memberInquiryService = (MemberInquiryService) context.getBean("memberInquiryService");

        int pendingRecords = memberInquiryService.getPendingRecordCount();

        logger.info("Current Number Of Pendinig Records (" + pendingRecords + ")");

        logger.info("Ending Inquiry Batch Process");
    }
于 2013-04-05T17:34:46.303 に答える