我刚开始使用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分钟运行一次的TransactionUpdater不是一个bean,它只是一个普通的类,在这里,我需要创建一个OrdersController对象来执行以下操作:listOrders,getOrderById,updateOrder。从另一个Controller文件,如UserController或BalanceController,它非常简单。但是从这里开始,如果我这样做,它将返回null:
据我所知,类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(未知来源)