店铺注册的逻辑:
- 将店铺信息插入到数据库中,返回店铺id
- 通过店铺id创建出存储图片的文件夹
- 在文件夹下去处理图片
- 把文件的地址更新回这条数据里
这四步中任何一步出错就要进行回滚,这种事务要在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,基本类型为相应的初始默认值),字段被删除将不设置。