Java Spring - 使用可运行方法

时间:2016-05-25 13:31:33

标签: java spring nullpointerexception

我刚开始使用Java Spring并遇到这个问题,老实说我甚至不知道如何描述它,请尝试理解我:

我以这种方式组织我的代码 第一:我有一种对象 - 订单:

1:订单:实体类,它是一个bean,具有属性和getter,setter。

2:OrdersDAO:具有以下方法的接口:getOrderById,listOrders,addOrder,removeOrder

3:OrderDAOImpl:一个类实现OrdersDAO,覆盖上面的方法并有hql查询来执行它们(我也在使用hibernate)

4:OrderService:具有上述方法的接口

5:OrderServiceImpl:实现OrderService并调用DAO类中的方法

6:OrdersController:这是控制器类,监听CRUD请求表单JSP文件。它有一个属性是OrdersService

7:我在1 xml文件中声明bean。

因此,当我从JSP访问,例如localhost:// myapp / listOrders时,OrdersController会侦听该请求, 然后调用OrderService, 然后OrderService调用OrdersDAO, 和OrdersDAO与数据库通信并将数据返回给OrdersController, 最后,OrdersController将数据发送回JSP文件。

除了Orders,我还有另一个对象集 - User,Balance,Company。它们中的每一个都具有完全相同的结构。他们都是这样组织的,工作得很好。

从OrderController我可以调用UsersService对象,并使用它来访问用户数据库 - 如listUser,getUserById,addUser,removeUser

现在是问题所在:

我需要每5分钟自动更新Orders信息,所以我使用ScheduledExecutorService,每5分钟调用一个名为TransactionUpdater的类,这是一个实现Runnable的类,并执行“run”方法。

每隔5分钟运行一次的

run()方法不能有任何参数,因为它是从Runable实现的

TransactionUpdater不是一个bean,它只是一个普通的类,在这里,我需要创建一个OrdersController对象来执行以下操作:listOrders,getOrderById,updateOrder。从另一个Controller文件,如UserController或BalanceController,它非常简单。但是从这里开始,如果我这样做,它将返回null:

当我创建:“OrdersController oc = new OrdersController()”,然后“List< Order> = oc.listOrders()”时,似乎我创建的oc对象不知道方法“listOrders”。

据我所知,类TransactionUpdater尚未与bean对象映射,因此它返回null,如果我执行该映射,那么它应该运行,但我不知道如何。

那么,你能告诉我我错过了什么,或者给我一个教程文章告诉我该怎么做?我刚刚开始使用Spring,请帮助我,非常感谢你阅读这个冗长而愚蠢的问题。

以下是代码:

@WebListener public class ServerUpdater implements ServletContextListener{
private ScheduledExecutorService scheduler;

@Override
public void contextInitialized(ServletContextEvent sce) {
    // TODO Auto-generated method stub
    scheduler = Executors.newSingleThreadScheduledExecutor();

    scheduler.scheduleAtFixedRate(new TransactionUpdater(), 0, 2, TimeUnit.MINUTES);
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    // TODO Auto-generated method stub
    scheduler.shutdownNow();
}

}

@Controller public class TransactionUpdater implements Runnable{

@Autowired
private OrdersService ordersService;

@Autowired(required = true)
@Qualifier(value = "ordersService")
public void setOrdersService(OrdersService us) {
    this.ordersService = us;
}

@Override
public void run() {
    // TODO Auto-generated method stub 
    System.out.println("Updating transactions");
    OrdersController oc = new OrdersController();
    try {
        oc.checkTransactionAllWaitingOrders();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
} }

@Controller public class OrdersController {

private OrdersService ordersService;

@Autowired(required = true)
@Qualifier(value = "ordersService")
public void setOrdersService(OrdersService us) {
    this.ordersService = us;
} public void checkTransactionAllWaitingOrders() throws Exception { 
    List<Orders> listOrders = this.ordersService.listOrders();
    for (int i = 0; i < listOrders.size(); i++) {
        if (listOrders.get(i).getOrderState().equals("WAITING")) {
            boolean checkOrder = this.transaction(listOrders.get(i));
            if (checkOrder == true) {
                this.updateBalanceAndPortfolioAfterTransaction(listOrders.get(i));
                System.out.println("ORDER "+ listOrders.get(i).getOrderId()+" COMPLETED !!!");
            }
            else{
                System.out.println("ORDER "+ listOrders.get(i).getOrderId()+" STILL WAITING !!!");
            }
        }
    }
}

错误: 显示java.lang.NullPointerException     在com.liberation.lab.controller.TransactionUpdater.update(TransactionUpdater.java:53)     在com.liberation.lab.controller.TransactionUpdater.run(TransactionUpdater.java:41)     at java.util.concurrent.Executors $ RunnableAdapter.call(Unknown Source)     at java.util.concurrent.FutureTask.runAndReset(Unknown Source)     at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(Unknown Source)     at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(Unknown Source)     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)     在java.lang.Thread.run(未知来源)

0 个答案:

没有答案