From 71b661d440e61c05f9935dd760ad0ccfe85715a1 Mon Sep 17 00:00:00 2001 From: johnniang Date: Mon, 9 Sep 2019 23:24:04 +0800 Subject: [PATCH] Relocate Transactional annotation --- .../run/halo/app/core/ControllerLogAop.java | 12 +- .../run/halo/app/service/PostService.java | 3 - .../app/service/base/BasePostService.java | 5 - .../app/service/impl/BasePostServiceImpl.java | 6 + .../app/service/impl/PostServiceImpl.java | 148 +++++++++--------- 5 files changed, 88 insertions(+), 86 deletions(-) diff --git a/src/main/java/run/halo/app/core/ControllerLogAop.java b/src/main/java/run/halo/app/core/ControllerLogAop.java index e5b6736c8..a2a7c1ad1 100644 --- a/src/main/java/run/halo/app/core/ControllerLogAop.java +++ b/src/main/java/run/halo/app/core/ControllerLogAop.java @@ -55,17 +55,19 @@ public class ControllerLogAop { return; } - boolean hasServletArg = false; + boolean shouldNotLog = false; for (Object arg : args) { - if (arg instanceof HttpServletRequest || + if (arg == null || + arg instanceof HttpServletRequest || arg instanceof HttpServletResponse || - arg instanceof MultipartFile) { - hasServletArg = true; + arg instanceof MultipartFile || + arg.getClass().isAssignableFrom(MultipartFile[].class)) { + shouldNotLog = true; break; } } - if (!hasServletArg) { + if (!shouldNotLog) { String requestBody = JsonUtils.objectToJson(args); log.debug("{}.{} Parameters: [{}]", clazzName, methodName, requestBody); } diff --git a/src/main/java/run/halo/app/service/PostService.java b/src/main/java/run/halo/app/service/PostService.java index bedf523c3..71cd51f65 100755 --- a/src/main/java/run/halo/app/service/PostService.java +++ b/src/main/java/run/halo/app/service/PostService.java @@ -3,7 +3,6 @@ package run.halo.app.service; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.lang.NonNull; -import org.springframework.transaction.annotation.Transactional; import run.halo.app.model.entity.Post; import run.halo.app.model.enums.PostStatus; import run.halo.app.model.params.PostQuery; @@ -55,7 +54,6 @@ public interface PostService extends BasePostService { * @return post created */ @NonNull - @Transactional PostDetailVO createBy(@NonNull Post post, Set tagIds, Set categoryIds, boolean autoSave); /** @@ -68,7 +66,6 @@ public interface PostService extends BasePostService { * @return updated post */ @NonNull - @Transactional PostDetailVO updateBy(@NonNull Post postToUpdate, Set tagIds, Set categoryIds, boolean autoSave); /** diff --git a/src/main/java/run/halo/app/service/base/BasePostService.java b/src/main/java/run/halo/app/service/base/BasePostService.java index e6f62a96d..520e045a5 100644 --- a/src/main/java/run/halo/app/service/base/BasePostService.java +++ b/src/main/java/run/halo/app/service/base/BasePostService.java @@ -4,7 +4,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; -import org.springframework.transaction.annotation.Transactional; import run.halo.app.model.dto.post.BasePostDetailDTO; import run.halo.app.model.dto.post.BasePostMinimalDTO; import run.halo.app.model.dto.post.BasePostSimpleDTO; @@ -154,7 +153,6 @@ public interface BasePostService extends CrudService extends CrudService extends CrudService extends CrudService extends Abstrac } @Override + @Transactional public void increaseVisit(long visits, Integer postId) { Assert.isTrue(visits > 0, "Visits to increase must not be less than 1"); Assert.notNull(postId, "Post id must not be null"); @@ -186,6 +188,7 @@ public abstract class BasePostServiceImpl extends Abstrac } @Override + @Transactional public void increaseLike(long likes, Integer postId) { Assert.isTrue(likes > 0, "Likes to increase must not be less than 1"); Assert.notNull(postId, "Goods id must not be null"); @@ -199,16 +202,19 @@ public abstract class BasePostServiceImpl extends Abstrac } @Override + @Transactional public void increaseVisit(Integer postId) { increaseVisit(1L, postId); } @Override + @Transactional public void increaseLike(Integer postId) { increaseLike(1L, postId); } @Override + @Transactional public POST createOrUpdateBy(POST post) { Assert.notNull(post, "Post must not be null"); diff --git a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java index c6d8ee938..5861dc4bc 100644 --- a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import run.halo.app.event.logger.LogEvent; import run.halo.app.event.post.PostVisitEvent; @@ -35,7 +36,6 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Subquery; import java.util.*; -import java.util.function.Supplier; import java.util.stream.Collectors; import static org.springframework.data.domain.Sort.Direction.DESC; @@ -105,49 +105,8 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe return postRepository.findAll(buildSpecByQuery(postQuery), pageable); } - /** - * Build specification by post query. - * - * @param postQuery post query must not be null - * @return a post specification - */ - @NonNull - private Specification buildSpecByQuery(@NonNull PostQuery postQuery) { - Assert.notNull(postQuery, "Post query must not be null"); - - return (Specification) (root, query, criteriaBuilder) -> { - List predicates = new LinkedList<>(); - - if (postQuery.getStatus() != null) { - predicates.add(criteriaBuilder.equal(root.get("status"), postQuery.getStatus())); - } - - if (postQuery.getCategoryId() != null) { - Subquery postSubquery = query.subquery(Post.class); - Root postCategoryRoot = postSubquery.from(PostCategory.class); - postSubquery.select(postCategoryRoot.get("postId")); - postSubquery.where( - criteriaBuilder.equal(root.get("id"), postCategoryRoot.get("postId")), - criteriaBuilder.equal(postCategoryRoot.get("categoryId"), postQuery.getCategoryId())); - predicates.add(criteriaBuilder.exists(postSubquery)); - } - - if (postQuery.getKeyword() != null) { - // Format like condition - String likeCondition = String.format("%%%s%%", StringUtils.strip(postQuery.getKeyword())); - - // Build like predicate - Predicate titleLike = criteriaBuilder.like(root.get("title"), likeCondition); - Predicate originalContentLike = criteriaBuilder.like(root.get("originalContent"), likeCondition); - - predicates.add(criteriaBuilder.or(titleLike, originalContentLike)); - } - - return query.where(predicates.toArray(new Predicate[0])).getRestriction(); - }; - } - @Override + @Transactional public PostDetailVO createBy(Post postToCreate, Set tagIds, Set categoryIds, boolean autoSave) { PostDetailVO createdPost = createOrUpdate(postToCreate, tagIds, categoryIds); if (!autoSave) { @@ -159,6 +118,7 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe } @Override + @Transactional public PostDetailVO updateBy(Post postToUpdate, Set tagIds, Set categoryIds, boolean autoSave) { // Set edit time postToUpdate.setEditTime(DateUtils.now()); @@ -171,36 +131,6 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe return updatedPost; } - private PostDetailVO createOrUpdate(@NonNull Post post, Set tagIds, Set categoryIds) { - Assert.notNull(post, "Post param must not be null"); - - // Create or update post - post = super.createOrUpdateBy(post); - - postTagService.removeByPostId(post.getId()); - - postCategoryService.removeByPostId(post.getId()); - - // List all tags - List tags = tagService.listAllByIds(tagIds); - - // List all categories - List categories = categoryService.listAllByIds(categoryIds); - - // Create post tags - List postTags = postTagService.mergeOrCreateByIfAbsent(post.getId(), ServiceUtils.fetchProperty(tags, Tag::getId)); - - log.debug("Created post tags: [{}]", postTags); - - // Create post categories - List postCategories = postCategoryService.mergeOrCreateByIfAbsent(post.getId(), ServiceUtils.fetchProperty(categories, Category::getId)); - - log.debug("Created post categories: [{}]", postCategories); - - // Convert to post detail vo - return convertTo(post, tags, categories); - } - @Override public Post getBy(PostStatus status, String url) { Post post = super.getBy(status, url); @@ -526,4 +456,76 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe return postDetailVO; } + + /** + * Build specification by post query. + * + * @param postQuery post query must not be null + * @return a post specification + */ + @NonNull + private Specification buildSpecByQuery(@NonNull PostQuery postQuery) { + Assert.notNull(postQuery, "Post query must not be null"); + + return (Specification) (root, query, criteriaBuilder) -> { + List predicates = new LinkedList<>(); + + if (postQuery.getStatus() != null) { + predicates.add(criteriaBuilder.equal(root.get("status"), postQuery.getStatus())); + } + + if (postQuery.getCategoryId() != null) { + Subquery postSubquery = query.subquery(Post.class); + Root postCategoryRoot = postSubquery.from(PostCategory.class); + postSubquery.select(postCategoryRoot.get("postId")); + postSubquery.where( + criteriaBuilder.equal(root.get("id"), postCategoryRoot.get("postId")), + criteriaBuilder.equal(postCategoryRoot.get("categoryId"), postQuery.getCategoryId())); + predicates.add(criteriaBuilder.exists(postSubquery)); + } + + if (postQuery.getKeyword() != null) { + // Format like condition + String likeCondition = String.format("%%%s%%", StringUtils.strip(postQuery.getKeyword())); + + // Build like predicate + Predicate titleLike = criteriaBuilder.like(root.get("title"), likeCondition); + Predicate originalContentLike = criteriaBuilder.like(root.get("originalContent"), likeCondition); + + predicates.add(criteriaBuilder.or(titleLike, originalContentLike)); + } + + return query.where(predicates.toArray(new Predicate[0])).getRestriction(); + }; + } + + private PostDetailVO createOrUpdate(@NonNull Post post, Set tagIds, Set categoryIds) { + Assert.notNull(post, "Post param must not be null"); + + // Create or update post + post = super.createOrUpdateBy(post); + + postTagService.removeByPostId(post.getId()); + + postCategoryService.removeByPostId(post.getId()); + + // List all tags + List tags = tagService.listAllByIds(tagIds); + + // List all categories + List categories = categoryService.listAllByIds(categoryIds); + + // Create post tags + List postTags = postTagService.mergeOrCreateByIfAbsent(post.getId(), ServiceUtils.fetchProperty(tags, Tag::getId)); + + log.debug("Created post tags: [{}]", postTags); + + // Create post categories + List postCategories = postCategoryService.mergeOrCreateByIfAbsent(post.getId(), ServiceUtils.fetchProperty(categories, Category::getId)); + + log.debug("Created post categories: [{}]", postCategories); + + // Convert to post detail vo + return convertTo(post, tags, categories); + } }