4-5 店铺注册之Service层的实现

店铺注册的逻辑:

  1. 将店铺信息插入到数据库中,返回店铺id
  2. 通过店铺id创建出存储图片的文件夹
  3. 在文件夹下去处理图片
  4. 把文件的地址更新回这条数据里

 

这四步中任何一步出错就要进行回滚,这种事务要在service层实现

1、添加店铺信息后,返回店铺状态类型

 

2、实现类编写(注意类上面要写@Service)

@Service
public class ShopServiceImpl implements ShopService{
	/**
	 * 流程:
	 * 添加店铺-添加图片-将图片相对地址存入数据库
	 * 
	 * 这三步任何一步失败都会回滚-用Runtime Exception
	 */
	@Autowired
	private ShopDao shopDao;
	@Override
	@Transactional
	public ShopExecution addShop(Shop shop, File shopImg) {
		//店铺不存在时,ShopExecution使用构造器--生成ShopExecution对象
		if (shop == null) {
			return new ShopExecution(ShopStateEnum.NULL_SHOP);
		}
		try {
			//给店铺信息赋初始值
			shop.setEnableStatus(0);
			shop.setCreateTime(new Date());
			shop.setLastEditTime(new Date());
			int effectedNum = shopDao.insertShop(shop);
			//添加后,如果影响行数<=0,则添加失败
			if(effectedNum<=0) {
				//抛出异常,终止事务执行
				//这里是RuntimeException而不是Exception的原因:只有RuntimeException 事务才能终止
				throw new ShopOperationException("店铺创建失败");
			} else {
				//添加成功后,先判断传入的图片是不是为空 
				if(shopImg != null) {
					//存储图片
					try {
						addShopImg(shop,shopImg);
					}catch (Exception e) {
						
						throw new ShopOperationException("addShopImg error"+e.getMessage());
						
					}
					
					//更新店铺的图片地址
					effectedNum = shopDao.updateShop(shop);
					if (effectedNum <= 0) {
						throw new ShopOperationException("更新图片地址失败");
					}
				}
			}
		}catch(Exception e){
			throw new ShopOperationException("addShop error"+e.getMessage());
		}
		//返回状态值-CHECK(待审核)
		return new ShopExecution(ShopStateEnum.CHECK, shop);
	}
	
	private void addShopImg(Shop shop, File shopImg) {
		//获取shop图片目录的相对路径
		String dest = PathUtil.getShopImagePath(shop.getShopId());
		String shopImgAddr = ImageUtil.generateThumbnail(shopImg, dest);//得出图片实际存储的绝对值路径,存片存入后返回图片的相对值路径
		shop.setShopImg(shopImgAddr);
	}
 
}

 

注意:以上代码抛出了很多异常,因此可以专门写一个异常类ShopOperationException便于查看管理

 

将这个类替换掉ShopServiceImpl里的RuntimeException

 

显式地定义serialVersionUID有两种用途: 

  1)在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。 

  2)当你序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值(对象为null,基本类型为相应的初始默认值),字段被删除将不设置。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值