试图在Java应用程序(Spring)中自动连接服务的NullPointerException

试图在Java应用程序(Spring)中自动连接服务的NullPointerException,java,spring,autowired,Java,Spring,Autowired,我正在编写一个Java应用程序,该应用程序将使用Spring、Hibernate等,它将被打包在一个Jar中,并从类似的命令运行 我现在的主要课程如下所示: public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); @Autowired private static MemberInquiryService memberInquiryServ

我正在编写一个Java应用程序,该应用程序将使用Spring、Hibernate等,它将被打包在一个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;
    }

}

Spring从不注入静态场。它只注入从应用程序上下文检索的对象,或者注入到其他对象中的对象

您甚至没有在程序中创建应用程序上下文,因此Spring在该程序中不起任何作用


我建议您阅读。

您需要从ClassPathXmlApplicationContext获取memberInquiryService

例如:-

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

基本上,在您的代码段中,MemberInquiryService不是spring管理的,因为您不是从spring容器中获得的。您还需要在spring config.xml中声明MmberInquiryService条目

我必须将主类更改为

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

您可以共享spring config.xml吗?我没有使用spring config.xml。。我使用的是JavaConfig..那么我该如何解决这个问题,请记住我使用的是JavaConfig。看起来你终于明白了,所以阅读文档可能会有所帮助。不足为奇。