1.深拷贝和浅拷贝
2.根据domain存储在相应的表中
{
“description”: “string”,
“name”: “string”,
“parentId”: 0,
“password”: “string”,
“slug”: “string”,
“thumbnail”: “string”
}
@PostMapping
@ApiOperation("Creates category") //Post -- >新建分类
public CategoryDTO createBy(@RequestBody @Valid CategoryParam categoryParam) { //输入参数: name, parentId
// Convert to category // 1.进入convertTo
Category category = categoryParam.convertTo();
// Save it // 7.进入create // 12.convertTo将对象转为DTO数据传输对象
return categoryService.convertTo(categoryService.create(category));
}
@Override
public Category convertTo() {
// 检查slug是否为空
slug = StringUtils.isBlank(slug) ? SlugUtils.slug(name) : SlugUtils.slug(slug);
// 检查缩写是否为空
if (null == thumbnail) {
thumbnail = "";
}
// 2.InputConverter接口调用父类的convertTo
return InputConverter.super.convertTo();
}
default D convertTo() {
// Get parameterized type // 3.进入parameterizedType --> run.halo.app.model.dto.base.InputConverter<run.halo.app.model.entity.Category>
ParameterizedType currentType = parameterizedType();
// Assert not equal
Objects.requireNonNull(currentType,
"Cannot fetch actual type because parameterized type is null");
Class<D> domainClass = (Class<D>) currentType.getActualTypeArguments()[0]; // 4. 从一个泛型类型中获取第一个泛型参数的类型类。--> Category
// BeanUtils.transformFrom浅拷贝
return BeanUtils.transformFrom(this, domainClass); // 6.返回一个Category
}
@Nullable
default ParameterizedType parameterizedType() {
return ReflectionUtils.getParameterizedType(InputConverter.class, this.getClass());
}
@Override
@Transactional
public Category create(Category category) {
Assert.notNull(category, "Category to create must not be null");
// 8. Check the category name
long count = categoryRepository.countByName(category.getName());
if (count > 0) {
log.error("Category has exist already: [{}]", category);
throw new AlreadyExistsException("该分类已存在");
}
// 9. Check parent id
if (!ServiceUtils.isEmptyId(category.getParentId())) {
count = categoryRepository.countById(category.getParentId());
if (count == 0) {
log.error("Parent category with id: [{}] was not found, category: [{}]",
category.getParentId(), category);
throw new NotFoundException(
"Parent category with id = " + category.getParentId() + " was not found");
}
}
if (StrUtil.isNotBlank(category.getPassword())) {
category.setPassword(category.getPassword().trim());
}
// 10. Create it 调用父类的create
return super.create(category);
}
@Override
public DOMAIN create(DOMAIN domain) {
Assert.notNull(domain, domainName + " data must not be null");
// 11.父类的repository怎么存储category???? --> 可以说成项目难点 哈哈哈
return repository.save(domain); // repository="run.halo.app.repository.base.BaseRepositoryImpl@53028286" //根据domain存储在相应的表中, 具体做法设计到反射,还有动态代理机制
}