在Spring中栽过的跟头①

在Spring中栽过的跟头①,第1张

原函数如下:

package org.Jdbc.c.service.impl;

import org.Jdbc.c.dao.AccountDao;
import org.Jdbc.c.dao.OrderDao;
import org.Jdbc.c.dao.StorageDao;
import org.Jdbc.c.entity.Account;
import org.Jdbc.c.entity.Order;
import org.Jdbc.c.entity.Storage;
import org.Jdbc.c.service.OrderService;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;

@Service("orderService")
public class OrderServiceImpl implements OrderService {
    private OrderDao orderDao;

    private AccountDao accountDao;

    private StorageDao storageDao;

    @Override
    public void createOrder(Order order) {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String format = df.format(new Date());
        String orderId = order.getUserId() + order.getProductId() + format;
        System.out.println("自动生成的订单ID:" + orderId);
        order.setOrderId(orderId);
        System.out.println("开始创建订单数据,订单号为:" + orderId);
        orderDao.createOrder(order);
        System.out.println("订单数据创建完成,订单号为:" + orderId);
        System.out.println("开始查询商品库存,商品ID:" + order.getProductId());
        Storage storage = storageDao.selectByProductId(order.getProductId());
        if (storage != null && storage.getResidue().intValue() >= order.getCount().intValue()) {
            System.out.println("商品库存充足,正在扣减商品库存");
            storage.setUsed(storage.getUsed() + order.getCount());
            storage.setResidue(storage.getTotal().intValue() - storage.getUsed());
            int decrease = storageDao.decrease(storage);
            System.out.println("商品库存扣减完成");
        } else {
            System.out.println("警告!商品库存不足,正在执行回滚 *** 作!");
            throw new RuntimeException("库存不足");
        }

        System.out.println("开始查询用户账户金额");
        Account account = accountDao.selectByUserId(order.getUserId());
        if (account != null && account.getResidue().intValue() >= order.getMoney().intValue()) {
            System.out.println("账户金额充足,正在扣减账金额");
            accountDao.decrease(order.getUserId(), order.getMoney());
            System.out.println("账户金额扣减完成");
        } else {
            System.out.println("警告!账户余额不足,正在执行回滚 *** 作!");
            throw new RuntimeException("账户余额不足");
        }
        System.out.println("开始修改订单状态,未完成>>>>>已完成");
        orderDao.updateOrderStatus(order.getOrderId(), 0);
        System.out.println("修改订单状态完成!");
    }

}

报错情况如下:

Exception in thread "main" java.lang.NullPointerException
	at org.Jdbc.c.service.impl.OrderServiceImpl.createOrder(OrderServiceImpl.java:31)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at com.sun.proxy.$Proxy11.createOrder(Unknown Source)
	at org.example.MainApp20.main(MainApp20.java:21)

找了半天都是提示orderDao是null状态,于是思考可否创建新对象
修改如下后运行结果正常
即new一个新对象

package org.Jdbc.c.service.impl;

import org.Jdbc.c.dao.AccountDao;
import org.Jdbc.c.dao.OrderDao;
import org.Jdbc.c.dao.StorageDao;
import org.Jdbc.c.entity.Account;
import org.Jdbc.c.entity.Order;
import org.Jdbc.c.entity.Storage;
import org.Jdbc.c.service.OrderService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service("orderService")
public class OrderServiceImpl implements OrderService {
    private OrderDao orderDao = new OrderDao() {
        @Override
        public int createOrder(Order order) {
            return 0;
        }

        @Override
        public void updateOrderStatus(String orderId, Integer status) {
        }
    };
    private AccountDao accountDao=new AccountDao() {
        @Override
        public Account selectByUserId(String userId) {
            return null;
        }

        @Override
        public int decrease(String userId, BigDecimal money) {
            return 0;
        }
    };
    private StorageDao storageDao=new StorageDao() {
        @Override
        public Storage selectByProductId(String productId) {
            return null;
        }

        @Override
        public int decrease(Storage record) {
            return 0;
        }
    };
    @Override
    public void createOrder(Order order) {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String format = df.format(new Date());
        String orderId = order.getUserId() + order.getProductId() + format;
        System.out.println("自动生成的订单ID:" + orderId);
        order.setOrderId(orderId);
        System.out.println("开始创建订单数据,订单号为:" + orderId);
        orderDao.createOrder(order);
        System.out.println("订单数据创建完成,订单号为:" + orderId);
        System.out.println("开始查询商品库存,商品ID:" + order.getProductId());
        Storage storage = storageDao.selectByProductId(order.getProductId());
        if (storage != null && storage.getResidue().intValue() >= order.getCount().intValue()) {
            System.out.println("商品库存充足,正在扣减商品库存");
            storage.setUsed(storage.getUsed() + order.getCount());
            storage.setResidue(storage.getTotal().intValue() - storage.getUsed());
            int decrease = storageDao.decrease(storage);
            System.out.println("商品库存扣减完成");
        } else {
            System.out.println("警告!商品库存不足,正在执行回滚 *** 作!");
            throw new RuntimeException("库存不足");
        }

        System.out.println("开始查询用户账户金额");
        Account account = accountDao.selectByUserId(order.getUserId());
        if (account != null && account.getResidue().intValue() >= order.getMoney().intValue()) {
            System.out.println("账户金额充足,正在扣减账金额");
            accountDao.decrease(order.getUserId(), order.getMoney());
            System.out.println("账户金额扣减完成");
        } else {
            System.out.println("警告!账户余额不足,正在执行回滚 *** 作!");
            throw new RuntimeException("账户余额不足");
        }
        System.out.println("开始修改订单状态,未完成>>>>>已完成");
        orderDao.updateOrderStatus(order.getOrderId(), 0);
        System.out.println("修改订单状态完成!");
    }

}


get √

学习Spring代码源自:
http://c.biancheng.net/spring/transaction-xml.html

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/734629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存