From 1a1a32cb4ab958d2441f1be9b5838e75fd45bc8d Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Thu, 21 Mar 2024 12:52:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E5=B8=B8=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../java/cn/lihongjie/coal/base/dto/R.java | 4 +- .../controller/EmpSalaryItemController.java | 4 +- .../dto/UpdateEmpSalaryItemDto.java | 4 ++ .../errorMsg/service/ErrorMsgService.java | 62 ++++++++++++++++++ .../service/OrganizationService.java | 3 - .../lihongjie/coal/runner/InitDataRunner.java | 4 ++ .../spring/config/GlobalExceptionHandler.java | 36 +++++++++++ .../coal/spring/config/ValidatorConfig.java | 63 +++++++++++++++++++ .../cn/lihongjie/coal/validator/Require.java | 34 ++++++++++ .../lihongjie/coal/validator/RequireCode.java | 26 ++++++++ .../coal/validator/RequireFiles.java | 26 ++++++++ .../lihongjie/coal/validator/RequireName.java | 27 ++++++++ .../coal/validator/RequireSortKey.java | 26 ++++++++ .../coal/validator/RequireValidator.java | 45 +++++++++++++ src/main/resources/config/errorMsg.json | 26 ++++++++ 16 files changed, 391 insertions(+), 5 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/spring/config/ValidatorConfig.java create mode 100644 src/main/java/cn/lihongjie/coal/validator/Require.java create mode 100644 src/main/java/cn/lihongjie/coal/validator/RequireCode.java create mode 100644 src/main/java/cn/lihongjie/coal/validator/RequireFiles.java create mode 100644 src/main/java/cn/lihongjie/coal/validator/RequireName.java create mode 100644 src/main/java/cn/lihongjie/coal/validator/RequireSortKey.java create mode 100644 src/main/java/cn/lihongjie/coal/validator/RequireValidator.java create mode 100644 src/main/resources/config/errorMsg.json diff --git a/pom.xml b/pom.xml index d3548008..832920e0 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,12 @@ reflections 0.10.2 + + + commons-beanutils + commons-beanutils + 1.9.4 + diff --git a/src/main/java/cn/lihongjie/coal/base/dto/R.java b/src/main/java/cn/lihongjie/coal/base/dto/R.java index 0032e57b..09f39564 100644 --- a/src/main/java/cn/lihongjie/coal/base/dto/R.java +++ b/src/main/java/cn/lihongjie/coal/base/dto/R.java @@ -44,7 +44,9 @@ public class R { public static R fail(String code, String msg) { return create(null, code, msg); } - + public static R fail(String code, String msg, T data) { + return create(data, code, msg); + } public static R create(T data, String code, String msg) { return new R<>(data, code, msg); diff --git a/src/main/java/cn/lihongjie/coal/empSalaryItem/controller/EmpSalaryItemController.java b/src/main/java/cn/lihongjie/coal/empSalaryItem/controller/EmpSalaryItemController.java index 016544bd..6e8fe400 100644 --- a/src/main/java/cn/lihongjie/coal/empSalaryItem/controller/EmpSalaryItemController.java +++ b/src/main/java/cn/lihongjie/coal/empSalaryItem/controller/EmpSalaryItemController.java @@ -11,6 +11,8 @@ import cn.lihongjie.coal.empSalaryItem.dto.UpdateEmpSalaryItemDto; import cn.lihongjie.coal.empSalaryItem.service.EmpSalaryItemService; import cn.lihongjie.coal.empSalaryItemConfig.service.EmpSalaryItemConfigService; +import jakarta.validation.Valid; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -34,7 +36,7 @@ public class EmpSalaryItemController { } @PostMapping("/update") - public EmpSalaryItemDto update(@RequestBody UpdateEmpSalaryItemDto request) { + public EmpSalaryItemDto update(@Valid @RequestBody UpdateEmpSalaryItemDto request) { return this.service.update(request); } diff --git a/src/main/java/cn/lihongjie/coal/empSalaryItem/dto/UpdateEmpSalaryItemDto.java b/src/main/java/cn/lihongjie/coal/empSalaryItem/dto/UpdateEmpSalaryItemDto.java index 1fc1debc..7b0f83dc 100644 --- a/src/main/java/cn/lihongjie/coal/empSalaryItem/dto/UpdateEmpSalaryItemDto.java +++ b/src/main/java/cn/lihongjie/coal/empSalaryItem/dto/UpdateEmpSalaryItemDto.java @@ -1,6 +1,8 @@ package cn.lihongjie.coal.empSalaryItem.dto; import cn.lihongjie.coal.base.dto.OrgCommonDto; +import cn.lihongjie.coal.validator.RequireCode; +import cn.lihongjie.coal.validator.RequireName; import lombok.Data; @@ -8,6 +10,8 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.Formula; @Data +@RequireName +@RequireCode public class UpdateEmpSalaryItemDto extends OrgCommonDto { diff --git a/src/main/java/cn/lihongjie/coal/errorMsg/service/ErrorMsgService.java b/src/main/java/cn/lihongjie/coal/errorMsg/service/ErrorMsgService.java index 41ff62f3..bbd76ad4 100644 --- a/src/main/java/cn/lihongjie/coal/errorMsg/service/ErrorMsgService.java +++ b/src/main/java/cn/lihongjie/coal/errorMsg/service/ErrorMsgService.java @@ -12,18 +12,28 @@ import cn.lihongjie.coal.errorMsg.entity.ErrorMsgEntity; import cn.lihongjie.coal.errorMsg.mapper.ErrorMsgMapper; import cn.lihongjie.coal.errorMsg.repository.ErrorMsgRepository; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.core.convert.ConversionService; +import org.springframework.core.io.ClassPathResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.InputStream; +import java.util.List; + @Service @Slf4j @Transactional @@ -82,4 +92,56 @@ public class ErrorMsgService extends BaseService errorMsgs; + + List exists = findAll(); + + try (InputStream inputStream = classPathResource.getInputStream()) { + errorMsgs = + mapper.readValue(inputStream, new TypeReference>() {}); + } + + for (ErrorMsgEntity defaultMsg : errorMsgs) { + + boolean found = false; + for (ErrorMsgEntity exist : exists) { + + if (StringUtils.equalsIgnoreCase(defaultMsg.getCode(), exist.getCode()) ){ + + + found = true; + + if (!StringUtils.equals(defaultMsg.getMsg(), exist.getMsg())){ + exist.setMsg(defaultMsg.getMsg()); + this.repository.save(exist); + } + + break; + + } + } + + if (!found) { + ErrorMsgEntity nd = new ErrorMsgEntity(); + nd.setCode(defaultMsg.getCode()); + nd.setName(defaultMsg.getName()); + nd.setMsg(defaultMsg.getMsg()); + + + + + this.repository.save(nd); + } + } + } } diff --git a/src/main/java/cn/lihongjie/coal/organization/service/OrganizationService.java b/src/main/java/cn/lihongjie/coal/organization/service/OrganizationService.java index 06f205c4..09b61aa2 100644 --- a/src/main/java/cn/lihongjie/coal/organization/service/OrganizationService.java +++ b/src/main/java/cn/lihongjie/coal/organization/service/OrganizationService.java @@ -10,7 +10,6 @@ import cn.lihongjie.coal.organization.dto.UpdateOrganizationDto; import cn.lihongjie.coal.organization.entity.OrganizationEntity; import cn.lihongjie.coal.organization.mapper.OrganizationMapper; import cn.lihongjie.coal.organization.repository.OrganizationRepository; -import cn.lihongjie.coal.salaryItem.service.SalaryItemService; import cn.lihongjie.coal.user.dto.CreateOrgAdminDto; import cn.lihongjie.coal.user.service.UserService; @@ -43,7 +42,6 @@ class OrganizationService extends BaseService allError = + ex.getBindingResult().getAllErrors().stream() + .map(oe -> oe.unwrap(ConstraintViolation.class)) + .collect(Collectors.toList()); + List> errorData = + allError.stream() + .map( + x -> + Map.of( + "field", + x.getPropertyPath() == null? "null" : x.getPropertyPath().toString(), + "msg", + x.getMessage(), + + "annotation", + x.getConstraintDescriptor() + .getAnnotation() == null ? "null":x.getConstraintDescriptor() + .getAnnotation() + .annotationType() + .getName())) + .collect(Collectors.toList()); + + return R.fail("validError", errorData.stream().map(x -> x.get("msg") + "").collect(Collectors.joining(", ")), errorData); + } + @ExceptionHandler(BizException.class) public R handleException( BizException ex, HttpServletRequest request, HandlerMethod handlerMethod) { diff --git a/src/main/java/cn/lihongjie/coal/spring/config/ValidatorConfig.java b/src/main/java/cn/lihongjie/coal/spring/config/ValidatorConfig.java new file mode 100644 index 00000000..ce11653a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/spring/config/ValidatorConfig.java @@ -0,0 +1,63 @@ +package cn.lihongjie.coal.spring.config; + +import cn.lihongjie.coal.errorMsg.service.ErrorMsgService; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.MessageSourceResolvable; +import org.springframework.context.NoSuchMessageException; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; + +import java.util.*; + +@Component +public class ValidatorConfig { + + @Autowired private ErrorMsgService errorMsgService; + + public MessageSource messageSource(){ + return new MessageSource() { + @Override + public String getMessage( + String code, Object[] args, String defaultMessage, Locale locale) { + + String message = errorMsgService.getMsg(code); + + return StringUtils.firstNonBlank(message, defaultMessage); + } + + @Override + public String getMessage(String code, Object[] args, Locale locale) + throws NoSuchMessageException { + return getMessage( + code, args, getMessage("default.message", args, "", locale), locale); + } + + @Override + public String getMessage(MessageSourceResolvable resolvable, Locale locale) + throws NoSuchMessageException { + + String[] codes = resolvable.getCodes(); + for (String code : codes) { + String message = getMessage(code, resolvable.getArguments(), "", locale); + if (StringUtils.isNotBlank(message)) { + return message; + } + } + + return resolvable.getDefaultMessage(); + } + }; + } + + @Bean + public LocalValidatorFactoryBean validator() { + LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean(); + + bean.setValidationMessageSource(messageSource()); + return bean; + } +} diff --git a/src/main/java/cn/lihongjie/coal/validator/Require.java b/src/main/java/cn/lihongjie/coal/validator/Require.java new file mode 100644 index 00000000..94349fd0 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/validator/Require.java @@ -0,0 +1,34 @@ +package cn.lihongjie.coal.validator; + +import static java.lang.annotation.ElementType.*; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; +import java.lang.annotation.Documented; + +@Target({ TYPE, ANNOTATION_TYPE, TYPE_USE }) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = RequireValidator.class) +@Documented +@Repeatable(Require.List.class) +public @interface Require { + + String message() default "{require.default}"; + + + String field() ; + + Class[] groups() default { }; + + Class[] payload() default { }; + + + @Target({ TYPE, ANNOTATION_TYPE, TYPE_USE }) + @Retention(RetentionPolicy.RUNTIME) + @Documented + @interface List { + Require[] value(); + } +} diff --git a/src/main/java/cn/lihongjie/coal/validator/RequireCode.java b/src/main/java/cn/lihongjie/coal/validator/RequireCode.java new file mode 100644 index 00000000..12b59a4a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/validator/RequireCode.java @@ -0,0 +1,26 @@ +package cn.lihongjie.coal.validator; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import jakarta.validation.*; +import jakarta.validation.constraints.*; + +import java.lang.annotation.*; +import java.lang.annotation.Documented; + +@NotNull +@Target({ TYPE, ANNOTATION_TYPE, TYPE_USE }) +@Require(field = "code") +@Retention(RUNTIME) +@Constraint(validatedBy = { }) +@Documented +@ReportAsSingleViolation +public @interface RequireCode { + + String message() default "{require.code}"; + + Class[] groups() default { }; + + Class[] payload() default { }; +} diff --git a/src/main/java/cn/lihongjie/coal/validator/RequireFiles.java b/src/main/java/cn/lihongjie/coal/validator/RequireFiles.java new file mode 100644 index 00000000..4c90c0f2 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/validator/RequireFiles.java @@ -0,0 +1,26 @@ +package cn.lihongjie.coal.validator; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import jakarta.validation.*; +import jakarta.validation.constraints.*; + +import java.lang.annotation.*; +import java.lang.annotation.Documented; + +@NotNull +@Target({ TYPE, ANNOTATION_TYPE, TYPE_USE }) +@Require(field = "fileIds") +@Retention(RUNTIME) +@Constraint(validatedBy = { }) +@Documented +@ReportAsSingleViolation +public @interface RequireFiles { + + String message() default "{require.fileIds}"; + + Class[] groups() default { }; + + Class[] payload() default { }; +} diff --git a/src/main/java/cn/lihongjie/coal/validator/RequireName.java b/src/main/java/cn/lihongjie/coal/validator/RequireName.java new file mode 100644 index 00000000..602864d7 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/validator/RequireName.java @@ -0,0 +1,27 @@ +package cn.lihongjie.coal.validator; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import jakarta.validation.*; +import jakarta.validation.constraints.*; + +import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.util.*; + +@NotNull +@Target({ TYPE, ANNOTATION_TYPE, TYPE_USE }) +@Require(field = "name") +@Retention(RUNTIME) +@Constraint(validatedBy = { }) +@Documented +@ReportAsSingleViolation +public @interface RequireName { + + String message() default "{require.name}"; + + Class[] groups() default { }; + + Class[] payload() default { }; +} diff --git a/src/main/java/cn/lihongjie/coal/validator/RequireSortKey.java b/src/main/java/cn/lihongjie/coal/validator/RequireSortKey.java new file mode 100644 index 00000000..abe6a824 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/validator/RequireSortKey.java @@ -0,0 +1,26 @@ +package cn.lihongjie.coal.validator; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import jakarta.validation.*; +import jakarta.validation.constraints.*; + +import java.lang.annotation.*; +import java.lang.annotation.Documented; + +@NotNull +@Target({ TYPE, ANNOTATION_TYPE, TYPE_USE }) +@Require(field = "sortKey") +@Retention(RUNTIME) +@Constraint(validatedBy = { }) +@Documented +@ReportAsSingleViolation +public @interface RequireSortKey { + + String message() default "{require.sortKey}"; + + Class[] groups() default { }; + + Class[] payload() default { }; +} diff --git a/src/main/java/cn/lihongjie/coal/validator/RequireValidator.java b/src/main/java/cn/lihongjie/coal/validator/RequireValidator.java new file mode 100644 index 00000000..af32a5b9 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/validator/RequireValidator.java @@ -0,0 +1,45 @@ +package cn.lihongjie.coal.validator; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; + +@Slf4j +public class RequireValidator implements ConstraintValidator { + + private String field; + + @Override + public void initialize(Require constraintAnnotation) { + + this.field = constraintAnnotation.field(); + } + + @SneakyThrows + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + + + try { + + Object fv = PropertyUtils.getProperty(value, field); + + if (fv instanceof CharSequence s){ + return StringUtils.isNotBlank(s); + } + + return !ObjectUtils.isEmpty(fv) ; + + } catch (Exception e) { + log.error("error", e); + return false; + } + + } +} diff --git a/src/main/resources/config/errorMsg.json b/src/main/resources/config/errorMsg.json new file mode 100644 index 00000000..b97079c1 --- /dev/null +++ b/src/main/resources/config/errorMsg.json @@ -0,0 +1,26 @@ +[ + { + "code": "success", + "msg": "成功" + }, + { + "code": "require.default", + "msg": "必填项未填写" + }, + { + "code": "require.name", + "msg": "名称必填" + }, + { + "code": "require.code", + "msg": "编码必填" + }, + { + "code": "require.sortKey", + "msg": "排序字段必填" + }, + { + "code": "require.fileIds", + "msg": "必须上传附件" + } +] \ No newline at end of file