浏览代码

完成参数校验工具类

tsurumure 8 月之前
父节点
当前提交
6f093776bd

+ 1 - 1
db/cms_article_category_i18n.sql

@@ -19,7 +19,7 @@ INSERT INTO cms_article_category_i18n (article_category_id, language, category_n
     (1, 'zh', '科技创新', '前沿科技与创新动态'),
     (1, 'zh', '科技创新', '前沿科技与创新动态'),
     (1, 'en', 'Technological Innovation', 'Frontier Technology and Innovation Trends'),
     (1, 'en', 'Technological Innovation', 'Frontier Technology and Innovation Trends'),
     (2, 'zh', '健康生活', '为你解析情感与人际关系'),
     (2, 'zh', '健康生活', '为你解析情感与人际关系'),
-    (2, 'zh', 'Healthy life', 'For you to analyze emotions and relationships'),
+    (2, 'en', 'Healthy life', 'For you to analyze emotions and relationships'),
     (3, 'zh', '情感关系', '为你解析情感与人际关系'),
     (3, 'zh', '情感关系', '为你解析情感与人际关系'),
     (3, 'en', 'Emotional Relationships', 'Analyze Emotions and Interpersonal Relationships'),
     (3, 'en', 'Emotional Relationships', 'Analyze Emotions and Interpersonal Relationships'),
     (4, 'zh', '旅行探索', '探索世界各地的旅行分享'),
     (4, 'zh', '旅行探索', '探索世界各地的旅行分享'),

+ 1 - 1
src/main/java/com/backendsys/entity/Cms/CmsArticleTranslationsDTO.java

@@ -14,7 +14,7 @@ public class CmsArticleTranslationsDTO {
     @NotNull(message="article_id 不能为空")
     @NotNull(message="article_id 不能为空")
     private Long article_id;
     private Long article_id;
 
 
-    @NotEmpty(message="language 不肥为空")
+    @NotEmpty(message="语言不能为空")
     private String language;
     private String language;
 
 
     @Size(max = 100, message = "资讯标题长度不超过 {max} 字符")
     @Size(max = 100, message = "资讯标题长度不超过 {max} 字符")

+ 1 - 1
src/main/java/com/backendsys/entity/Cms/CmsPageTranslationsDTO.java

@@ -14,7 +14,7 @@ public class CmsPageTranslationsDTO {
     @NotNull(message="page_id 不能为空")
     @NotNull(message="page_id 不能为空")
     private Long page_id;
     private Long page_id;
 
 
-    @NotEmpty(message="language 不肥为空")
+    @NotEmpty(message="语言不能为空")
     private String language;
     private String language;
 
 
     @Size(max = 100, message = "内容标题长度不超过 {max} 字符")
     @Size(max = 100, message = "内容标题长度不超过 {max} 字符")

+ 4 - 6
src/main/java/com/backendsys/modules/cms/article/entity/ArticleCategoryI18n.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -23,14 +22,13 @@ public class ArticleCategoryI18n {
     private Long id;
     private Long id;
 
 
     @TableField("id")
     @TableField("id")
-    @NotNull(message="(translations) article_category_id 不能为空", groups = { Detail.class, Update.class })
     private Long article_category_id;
     private Long article_category_id;
-    @NotEmpty(message="(translations) language 不能为空")
+    @NotEmpty(message="语言不能为空", groups = { Create.class, Update.class })
     private String language;
     private String language;
 
 
-    @Size(max = 20, message = "资讯分类名称长度不超过 {max} 字符", groups = { Create.class, Update.class})
-    @NotBlank(message="(translations) 资讯分类名称不能为空", groups = { Create.class, Update.class, })
+    @Size(max = 20, message = "资讯分类名称长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    @NotBlank(message="资讯分类名称不能为空", groups = { Create.class, Update.class })
     private String category_name;
     private String category_name;
-    @Size(max = 200, message = "(translations) 资讯分类描述长度不超过 {max} 字符", groups = { Create.class, Update.class})
+    @Size(max = 200, message = "资讯分类描述长度不超过 {max} 字符", groups = { Create.class, Update.class })
     private String category_description;
     private String category_description;
 }
 }

+ 13 - 8
src/main/java/com/backendsys/modules/cms/article/entity/ArticleI18n.java

@@ -11,24 +11,29 @@ import lombok.Data;
 @Data
 @Data
 @TableName("cms_article_i18n")
 @TableName("cms_article_i18n")
 public class ArticleI18n {
 public class ArticleI18n {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
     @TableId(type = IdType.AUTO)
     @TableId(type = IdType.AUTO)
     private Long id;
     private Long id;
 
 
-    @NotNull(message="article_id 不能为空")
     private Long article_id;
     private Long article_id;
-    @NotEmpty(message="language 不肥为空")
+    @NotEmpty(message="语言不能为空", groups = { Create.class, Update.class })
     private String language;
     private String language;
 
 
-    @Size(max = 100, message = "资讯标题长度不超过 {max} 字符")
-    @NotEmpty(message="资讯标题不能为空")
+    @Size(max = 100, message = "资讯标题长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    @NotEmpty(message="资讯标题不能为空", groups = { Create.class, Update.class })
     private String title;
     private String title;
-    @Size(max = 200, message = "资讯描述长度不超过 {max} 字符")
+    @Size(max = 200, message = "资讯描述长度不超过 {max} 字符", groups = { Create.class, Update.class })
     private String description;
     private String description;
-    @Size(max = 10000, message = "资讯内容长度不超过 {max} 字符")
+    @Size(max = 10000, message = "资讯内容长度不超过 {max} 字符", groups = { Create.class, Update.class })
     @NotEmpty(message="资讯内容不能为空")
     @NotEmpty(message="资讯内容不能为空")
     private String content;
     private String content;
-    @Size(max = 100, message = "关键词长度不超过 {max} 字符")
+    @Size(max = 100, message = "关键词长度不超过 {max} 字符", groups = { Create.class, Update.class })
     private String meta_keyword;
     private String meta_keyword;
-    @Size(max = 200, message = "关键词描述长度不超过 {max} 字符")
+    @Size(max = 200, message = "关键词描述长度不超过 {max} 字符", groups = { Create.class, Update.class })
     private String meta_description;
     private String meta_description;
 }
 }

+ 3 - 21
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleCategoryServiceImpl.java

@@ -1,33 +1,22 @@
 package com.backendsys.modules.cms.article.service.impl;
 package com.backendsys.modules.cms.article.service.impl;
 
 
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.cms.article.dao.ArticleCategoryDao;
 import com.backendsys.modules.cms.article.dao.ArticleCategoryDao;
-import com.backendsys.modules.cms.article.dao.ArticleCategoryDao;
 import com.backendsys.modules.cms.article.dao.ArticleCategoryI18nDao;
 import com.backendsys.modules.cms.article.dao.ArticleCategoryI18nDao;
 import com.backendsys.modules.cms.article.entity.ArticleCategory;
 import com.backendsys.modules.cms.article.entity.ArticleCategory;
-import com.backendsys.modules.cms.article.entity.ArticleCategory;
 import com.backendsys.modules.cms.article.entity.ArticleCategoryI18n;
 import com.backendsys.modules.cms.article.entity.ArticleCategoryI18n;
 import com.backendsys.modules.cms.article.service.ArticleCategoryService;
 import com.backendsys.modules.cms.article.service.ArticleCategoryService;
-import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.modules.common.utils.ValidationUtil;
 import com.backendsys.modules.common.utils.ValidationUtil;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
 import com.backendsys.utils.v2.PageUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
-import jakarta.validation.ValidatorFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Service
 @Service
@@ -72,13 +61,6 @@ public class ArticleCategoryServiceImpl implements ArticleCategoryService {
 
 
         // 批量插入 (翻译字段)
         // 批量插入 (翻译字段)
         List<ArticleCategoryI18n> translations = articleCategory.getTranslations().stream()
         List<ArticleCategoryI18n> translations = articleCategory.getTranslations().stream()
-//            .peek(item -> {
-//                // 参数校验
-//                Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
-//                Set<ConstraintViolation<ArticleCategoryI18n>> violations = validator.validate(item);
-//                if (!violations.isEmpty()) throw new CustException(violations.iterator().next().getMessage());
-//            })
-//            .peek(ValidationUtil::validateObject)
             .peek(item -> { ValidationUtil.validateObject(item, ArticleCategoryI18n.Create.class); })
             .peek(item -> { ValidationUtil.validateObject(item, ArticleCategoryI18n.Create.class); })
             .map(item -> { item.setArticle_category_id(article_category_id); return item; })
             .map(item -> { item.setArticle_category_id(article_category_id); return item; })
             .collect(Collectors.toList());
             .collect(Collectors.toList());
@@ -105,14 +87,14 @@ public class ArticleCategoryServiceImpl implements ArticleCategoryService {
 
 
         // 批量更新 (翻译字段)
         // 批量更新 (翻译字段)
         List<ArticleCategoryI18n> translations = articleCategory.getTranslations().stream()
         List<ArticleCategoryI18n> translations = articleCategory.getTranslations().stream()
-                .map(t -> { t.setArticle_category_id(article_category_id); return t; })
-                .collect(Collectors.toList());
+            .peek(item -> { ValidationUtil.validateObject(item, ArticleCategoryI18n.Update.class); })
+            .map(t -> { t.setArticle_category_id(article_category_id); return t; })
+            .collect(Collectors.toList());
         articleCategoryI18nDao.updateBatch(translations);
         articleCategoryI18nDao.updateBatch(translations);
 
 
         return Map.of("article_category_id", article_category_id);
         return Map.of("article_category_id", article_category_id);
     }
     }
 
 
-
     /**
     /**
      * 删除资讯分类
      * 删除资讯分类
      */
      */

+ 3 - 11
src/main/java/com/backendsys/modules/cms/article/service/impl/ArticleServiceImpl.java

@@ -8,13 +8,11 @@ import com.backendsys.modules.cms.article.entity.Article;
 import com.backendsys.modules.cms.article.entity.ArticleI18n;
 import com.backendsys.modules.cms.article.entity.ArticleI18n;
 import com.backendsys.modules.cms.article.service.ArticleService;
 import com.backendsys.modules.cms.article.service.ArticleService;
 import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
+import com.backendsys.modules.common.utils.ValidationUtil;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
 import com.backendsys.utils.v2.PageUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -71,16 +69,9 @@ public class ArticleServiceImpl implements ArticleService {
 
 
         Long article_id = article.getId();
         Long article_id = article.getId();
 
 
-
-
         // 批量插入 (翻译字段)
         // 批量插入 (翻译字段)
         List<ArticleI18n> translations = article.getTranslations().stream()
         List<ArticleI18n> translations = article.getTranslations().stream()
-            .peek(item -> {
-                // 参数校验
-                Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
-                Set<ConstraintViolation<ArticleI18n>> violations = validator.validate(item);
-                if (!violations.isEmpty()) throw new CustException(violations.iterator().next().getMessage());
-            })
+            .peek(item -> { ValidationUtil.validateObject(item, ArticleI18n.Create.class); })
             .map(item -> { item.setArticle_id(article_id); return item; })
             .map(item -> { item.setArticle_id(article_id); return item; })
             .collect(Collectors.toList());
             .collect(Collectors.toList());
         articleI18nDao.insertBatch(translations);
         articleI18nDao.insertBatch(translations);
@@ -106,6 +97,7 @@ public class ArticleServiceImpl implements ArticleService {
 
 
         // 批量更新 (翻译字段)
         // 批量更新 (翻译字段)
         List<ArticleI18n> translations = article.getTranslations().stream()
         List<ArticleI18n> translations = article.getTranslations().stream()
+            .peek(item -> { ValidationUtil.validateObject(item, ArticleI18n.Update.class); })
             .map(t -> { t.setArticle_id(article_id); return t; })
             .map(t -> { t.setArticle_id(article_id); return t; })
             .collect(Collectors.toList());
             .collect(Collectors.toList());
         articleI18nDao.updateBatch(translations);
         articleI18nDao.updateBatch(translations);

+ 1 - 3
src/main/java/com/backendsys/modules/cms/navigation/entity/NavigationI18n.java

@@ -15,10 +15,8 @@ public class NavigationI18n {
     public static interface Update{}
     public static interface Update{}
     public static interface Delete{}
     public static interface Delete{}
 
 
-    @Size(max = 20, message = "菜单名称长度不超过 {max} 字符", groups = { Create.class, Update.class })
     private Long navigation_id;
     private Long navigation_id;
-
-    @NotEmpty(message="language 不肥为空")
+    @NotEmpty(message="语言不能为空")
     private String language;
     private String language;
     @Size(max = 20, message = "菜单名称长度不超过 {max} 字符", groups = { Create.class, Update.class })
     @Size(max = 20, message = "菜单名称长度不超过 {max} 字符", groups = { Create.class, Update.class })
     private String navigation_name;
     private String navigation_name;

+ 6 - 3
src/main/java/com/backendsys/modules/cms/navigation/service/impl/NavigationServiceImpl.java

@@ -2,11 +2,13 @@ package com.backendsys.modules.cms.navigation.service.impl;
 
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.IdUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.exception.CustException;
+import com.backendsys.modules.cms.article.entity.ArticleCategoryI18n;
 import com.backendsys.modules.cms.navigation.dao.NavigationDao;
 import com.backendsys.modules.cms.navigation.dao.NavigationDao;
 import com.backendsys.modules.cms.navigation.dao.NavigationI18nDao;
 import com.backendsys.modules.cms.navigation.dao.NavigationI18nDao;
 import com.backendsys.modules.cms.navigation.entity.Navigation;
 import com.backendsys.modules.cms.navigation.entity.Navigation;
 import com.backendsys.modules.cms.navigation.entity.NavigationI18n;
 import com.backendsys.modules.cms.navigation.entity.NavigationI18n;
 import com.backendsys.modules.cms.navigation.service.NavigationService;
 import com.backendsys.modules.cms.navigation.service.NavigationService;
+import com.backendsys.modules.common.utils.ValidationUtil;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageEntity;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.response.PageInfoResult;
 import com.backendsys.utils.v2.PageUtils;
 import com.backendsys.utils.v2.PageUtils;
@@ -37,7 +39,6 @@ public class NavigationServiceImpl implements NavigationService {
         return new PageInfoResult(list).toEntity();
         return new PageInfoResult(list).toEntity();
     }
     }
 
 
-
     /**
     /**
      * 获取导航详情
      * 获取导航详情
      */
      */
@@ -64,7 +65,8 @@ public class NavigationServiceImpl implements NavigationService {
 
 
         // 批量插入 (翻译字段)
         // 批量插入 (翻译字段)
         List<NavigationI18n> translations = navigation.getTranslations().stream()
         List<NavigationI18n> translations = navigation.getTranslations().stream()
-            .map(t -> { t.setNavigation_id(navigation_id); return t; })
+            .peek(item -> { ValidationUtil.validateObject(item, NavigationI18n.Create.class); })
+            .map(item -> { item.setNavigation_id(navigation_id); return item; })
             .collect(Collectors.toList());
             .collect(Collectors.toList());
         navigationI18nDao.insertBatch(translations);
         navigationI18nDao.insertBatch(translations);
 
 
@@ -88,7 +90,8 @@ public class NavigationServiceImpl implements NavigationService {
 
 
         // 批量更新 (翻译字段)
         // 批量更新 (翻译字段)
         List<NavigationI18n> translations = navigation.getTranslations().stream()
         List<NavigationI18n> translations = navigation.getTranslations().stream()
-            .map(t -> { t.setNavigation_id(navigation_id); return t; })
+            .peek(item -> { ValidationUtil.validateObject(item, NavigationI18n.Update.class); })
+            .map(item -> { item.setNavigation_id(navigation_id); return item; })
             .collect(Collectors.toList());
             .collect(Collectors.toList());
         navigationI18nDao.updateBatch(translations);
         navigationI18nDao.updateBatch(translations);
 
 

+ 5 - 4
src/main/java/com/backendsys/modules/common/utils/ValidationUtil.java

@@ -7,6 +7,7 @@ import jakarta.validation.ConstraintViolation;
 import jakarta.validation.Validation;
 import jakarta.validation.Validation;
 import jakarta.validation.Validator;
 import jakarta.validation.Validator;
 
 
+import java.util.Optional;
 import java.util.Set;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -17,10 +18,10 @@ public class ValidationUtil {
     public static <T> void validateObject(T object, Class<?>... groups) {
     public static <T> void validateObject(T object, Class<?>... groups) {
         Set<ConstraintViolation<T>> violations = validator.validate(object, groups);
         Set<ConstraintViolation<T>> violations = validator.validate(object, groups);
         if (!violations.isEmpty()) {
         if (!violations.isEmpty()) {
-            String errorMessage = violations.stream()
-                    .map(ConstraintViolation::getMessage)
-                    .collect(Collectors.joining(", "));
-            throw new CustException(errorMessage);
+            Optional<ConstraintViolation<T>> violation = violations.stream().findFirst();
+            String errorMessage = violation.get().getMessage();
+            String propertyName = violation.get().getPropertyPath().toString();
+            throw new CustException(errorMessage, ResultEnum.PARAMETER_EXCEPTION.getCode(), "Field: " + propertyName);
         }
         }
     }
     }