{"id":18253694,"url":"https://github.com/fashionbrot/mars-validated","last_synced_at":"2025-07-28T23:35:36.401Z","repository":{"id":50079147,"uuid":"227790212","full_name":"fashionbrot/mars-validated","owner":"fashionbrot","description":"暂停维护，已迁移到 https://github.com/fashionbrot/validation 下","archived":false,"fork":false,"pushed_at":"2023-06-28T14:51:45.000Z","size":448,"stargazers_count":26,"open_issues_count":5,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-04T17:36:53.614Z","etag":null,"topics":["spring-validated","springboot-validated","springcloud-validated","validate","validated"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fashionbrot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-13T08:18:01.000Z","updated_at":"2024-04-01T01:07:05.000Z","dependencies_parsed_at":"2024-11-05T10:08:11.332Z","dependency_job_id":"b8db1290-f7e5-4d8c-8ee3-963db7699c31","html_url":"https://github.com/fashionbrot/mars-validated","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/fashionbrot/mars-validated","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fashionbrot%2Fmars-validated","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fashionbrot%2Fmars-validated/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fashionbrot%2Fmars-validated/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fashionbrot%2Fmars-validated/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fashionbrot","download_url":"https://codeload.github.com/fashionbrot/mars-validated/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fashionbrot%2Fmars-validated/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267604444,"owners_count":24114534,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["spring-validated","springboot-validated","springcloud-validated","validate","validated"],"created_at":"2024-11-05T10:08:01.803Z","updated_at":"2025-07-28T23:35:36.376Z","avatar_url":"https://github.com/fashionbrot.png","language":"Java","funding_links":[],"categories":["对象校验"],"sub_categories":["语音合成"],"readme":"# mars-validated springmvc springboot springcloud dubbo  参数校验\n简单好用的 springmvc springboot springcloud dubbo  参数校验\nvalidated 是 控制 springmvc  springboot 的验证框架。此框架基于spring 开发。\n\n##### github:https://github.com/fashionbrot/mars-validated.git\n##### gitee :https://gitee.com/fashionbrot/mars-validated.git\n\n| 版本        | 新增功能                                                                                                                                                                                                                                              |\n|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 1.0.0     | 1、参数验证基本功能上线                                                                                                                                                                                                                                      |\n| 1.0.1     | 1、新增验证注解 \u003cbr\u003e2、Validated 注解增加validClass方法，可以选择性验证自己想要的参数。 \u003cbr\u003e 3、新增Default 注解                                                                                                                                                                     |\n| 1.0.2     | 1、代码逻辑优化。\u003cbr\u003e2、新增groups 功能，可以根据groups 选择性验证                                                                                                                                                                                                       |\n| 1.0.3     | 1、Constraint 接口增加  validatedByBean 方法，用来自定义注解实现 \u003cbr/\u003e2、新增国际化支持 EnableValidatedConfig 中增加了 language方法、localeParamName方法用来实现消息内容国际化支持，目前支持中英文两种。其他语言请自行添加 \u003cbr/\u003e 3、增加1.0.3 的validated-springboot-starter 支持                                          |\n| 2.0.0     | 1、Constraint 接口删除  validatedByBean 方法 \u003cbr/\u003e 2、删除ConstraintValidatorBean 接口 \u003cbr/\u003e  3、ConstraintValidator 新增  modify 方法、validObject 方法 \u003cbr/\u003e 4、Validated 注解增加 failFast快速失败方法、增加validReturnValue 方法（验证返回值） \u003cbr/\u003e 5、重构了以前的逻辑，相比hibernate valid 速度快1倍左右 |\n| 2.0.1     | 1、修复 @Validation.groups={AddGroup.class} 并且 注解.groups ={} 时,注解.groups ={}代表默认Groups,则不验证是否包含  @Validation.groups={AddGroup.class},代表跳过groups 验证                                                                                                   |\n| 2.0.2     | 1、优化bean注入问题 2、maven 编译修改为gradle 编译 3、代码优化                                                                                                                                                                                                        |\n| ~~2.0.3~~ | 1、优化验证逻辑实现   2、删除 ConstraintValidator接口中的 validObject 方法。   3、所有注解可实现bean 验证，不在是对基本类型的验证，所有对象都可验证                                                                                                                                                 |\n| ~~2.0.4~~ | 优化快速失败逻辑                                                                                                                                                                                                                                          |\n| ~~2.0.5~~ | 修改默认注解groups={DefaultGroup.class} @Validated(groups={DefaultGroup.class})                                                                                                                                                                         |\n| ~~2.0.6~~ | 修复2.0.3、2.0.4、2.0.5 参数带其他注解时导致参数验证失败bug                                                                                                                                                                                                           |\n| 2.0.7     | 修复自定义注解无法验证问题                                                                                                                                                                                                                                     |\n|2.0.8 | 代码优化、新增@Valid 注解，用于参数和属性的数组或List类型 如：UserReq[] userReq 、List\u003cUserReq\u003e userReq                                                                                                                                                                     |\n### hibernate valid 最新版本  和 mars validated 2.0.1 比较 调用1000次接口时间比较,验证参数10个 速度最优还是 mars-validated\n\n\n\n# validated 参数验证\n\n## 使用环境\n\nspring4.0 及以上\njdk1.8    及以上\n\n\n|Annotation|Supported data types|作用\n|---|--------|---|\n|NotBlank|String|验证String 字符串是否为空|\n|NotNull|String,Object,Integer,Long,Double,Short,Float,BigDecimal, BigInteger| 验证对象是否为空|\n|NotEmpty|String |验证字符串不能为空|\n|AssertFalse|Boolean,boolean,String|只能为false|\n|AssertTrue|Boolean,boolean,String|只能为true|\n|BankCard|String|验证银行卡|\n|CreditCard|String|验证信用卡|\n|Default|Integer,Double,Long,Short,Float,BigDecimal,String|设置默认值|\n|Digits|String|验证是否是数字|\n|Email|String|验证是否是邮箱|\n|IdCard|String|验证是否是身份证，验证18岁|\n|Length|int,long,short,double,Integer,Long,Float,Double,Short,String|验证长度|\n|Pattern|String|正则表达式验证|\n|Phone|String|验证手机号是否正确|\n|Size|object[],boolean[],byte[],char[],double[],float[],int[],long[],short[],String length,Collection,Map|验证大小值|\n|NotEqualLength|String|验证长度|\n\n\n## @Validated 注解支持功能说明： 接口方法添加此注解开启参数验证\n|方法| 默认值                  | 说明                       |\n|------|----------------------|--------------------------|\n|Class\u003c?\u003e[] validClass() default {}| {}                   | 需要校验的 class,只对填写的class验证 |\n|Class\u003c?\u003e[] groups() default { }| {DefaultGroup.class} | 校验组                      |\n|boolean failFast() default true| true                 | true 快速失败 false全部验证完失败   |\n|boolean validReturnValue() default false| false                | 验证返回值 默认false            |\n\n## @Valid 注解支持功能说明，作用于 参数、属性上使用\n### 用于参数如： List《UserReq》 userListReq 、UserReq[] userReqs 、List\u003c基本类型\u003e reqList、基本类型[] reqs\n\n\n## 1、springboot、springcloud 使用配置\n### 1.1、导入jar\n#### maven 依赖\n```xml\n        \u003c!-- springboot 依赖--\u003e\n        \u003cdependency\u003e\n               \u003cgroupId\u003ecom.github.fashionbrot\u003c/groupId\u003e\n               \u003cartifactId\u003evalidated-springboot-starter\u003c/artifactId\u003e\n               \u003cversion\u003e2.0.8\u003c/version\u003e\n        \u003c/dependency\u003e\n```\n#### gradle 依赖\n```bash\nimplementation 'com.github.fashionbrot:validated-springboot-starter:2.0.8'\n```\n\n### 1.2、参数验证\n```java\n@Controller\npublic class NotEmptyController {\n\n    @RequestMapping(\"/notEmpty\")\n    @ResponseBody\n    @Validated       //开启接口注解\n    public String  test(@NotEmpty(msg = \"入参 abc is null\") String abc){\n        return \"ok\";\n    }\n\n}\n```\n\n\n## 2、springmvc  使用配置\n### 2.1、导入jar\n#### maven依赖\n```xml\n        \u003c!-- springmvc 依赖--\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ecom.github.fashionbrot\u003c/groupId\u003e\n            \u003cartifactId\u003emars-validated\u003c/artifactId\u003e\n            \u003cversion\u003e2.0.8\u003c/version\u003e\n        \u003c/dependency\u003e\n```\n#### gradle 依赖\n```bash\nimplementation 'com.github.fashionbrot:mars-validated:2.0.8'\n```\n\n### 2.2、配置扫描类\n```java\n@Component\n@Configuration\n@EnableValidatedConfig\npublic class ValidConfig {\n\n}\n```\n### 2.3、使用配置\n```java\n@Controller\npublic class NotEmptyController {\n\n    @RequestMapping(\"/notEmpty\")\n    @ResponseBody\n    @Validated(failFast = true) //开启验证\n    public NotEmptyModel  test(@NotEmpty(msg = \"入参 abc is null\") String abc){\n\n        NotEmptyModel b=new NotEmptyModel();\n\n        return b;\n    }\n    @RequestMapping(\"/notEmpty2\")\n    @ResponseBody\n    @Validated(failFast = false)//开启验证\n    public String test(@NotEmpty NotEmptyModel notNullModel){\n        return notNullModel.getAbc();\n    }\n}\n\n```\n\n## 3、配置全局异常处理\n\n```java\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\n    //用于全局异常\n    @ExceptionHandler(ValidatedException.class)\n    @ResponseStatus(HttpStatus.OK)\n    public Object ValidatedException(ValidatedException e) {\n        List\u003cMarsViolation\u003e violations = e.getViolations();\n        String msg = e.getMsg();\n        if (ObjectUtil.isNotEmpty(violations)) {\n            if (violations.size() == 1) {\n                msg = violations.get(0).getMsg();\n            } else {\n                msg =  violations.stream().map(m -\u003e m.getMsg()).collect(Collectors.joining(\",\"));\n            }\n        }\n        return msg;\n    }\n\n}\n```\n\n\n\n# 以下是介绍各种配置\n\n| 配置项                      | 默认值   | 说明                                                                                      |\n|--------------------------|-------|-----------------------------------------------------------------------------------------|\n| mars.validated.file-name | valid | 代表resources下面的配置文件  valid_zh_CN.properties 的文件名                                         |\n|mars.validated.language|zh_CN| 代表resources下面配置文件 valid_zh_CN.properties   语言                                           |\n|mars.validated.locale-param-name|lang| 浏览器参数配置 lang=zh_CN`  `mars.validated.file-name=valid 则读取的配置文件为valid_zh_CN.properties语言包 |\n\n\n#### springboot配置方式\n```properties\nmars.validated.file-name=valid\nmars.validated.language=zh_CN\nmars.validated.locale-param-name=lang\n```\n\n#### springmvc 配置方式\n```java\n@Component\n@Configuration\n@EnableValidatedConfig(fileName = \"valid\",language=\"zh_CN\",localeParamName=\"lang\")\npublic class ValidConfig {\n}\n```\n\n## 支持 默认值设置   hibernate默认不支持\n```java\nimport com.github.fashionbrot.validated.annotation.Default;\n@Data\npublic class BaseModel {\n\n    @Default(\"1\")\n    private Integer pageNo;\n\n    @Default(\"20\")\n    private Integer pageSize;\n}\n```\n\n\n\n####  通过aop 自定义拦截\n```java\n@Component\n@Aspect\npublic class ValidAspect {\n\n    @Pointcut(\"execution(* com.github.fashion.test.service.*.*(..))\")\n    private void pointcut() {}\n\n    @Autowired\n    private MarsValidator marsValidator;\n\n    @Around(value = \"pointcut()\")\n    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {\n        //打印方法的信息\n        Object[] args = joinPoint.getArgs();\n        Signature signature = joinPoint.getSignature();\n        MethodSignature methodSignature = (MethodSignature)signature;\n        //自定义参数验证\n        marsValidator.parameterAnnotationValid(methodSignature.getMethod(),args);\n\n        return joinPoint.proceed();\n    }\n\n}\n\n```\n\n\n## ** 通过 group 来分组验证参数  **\n```bash\n访问：http://localhost:8080/group/add  返回：name 不能为空\n访问：http://localhost:8080/group/edit 返回：id 不能为空,name 不能为空\n```\n```java\npackage com.github.fashion.test.controller;\nimport com.github.fashion.test.groups.EditGroup;\nimport com.github.fashion.test.model.GroupModel;\nimport com.github.fashionbrot.validated.annotation.Validated;\nimport com.github.fashionbrot.validated.groups.DefaultGroup;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\n@Controller\n@RequestMapping(\"/group\")\npublic class GroupController {\n\n    @GetMapping(\"add\")\n    @ResponseBody\n    @Validated(failFast = false)\n    public String add(GroupModel groupModel){\n        return \"ok\";\n    }\n\n    @GetMapping(\"edit\")\n    @ResponseBody\n    @Validated(groups ={EditGroup.class,DefaultGroup.class},failFast = false)\n    public String edit(GroupModel groupModel){\n        return \"ok\";\n    }\n\n}\n```\n```java\npackage com.github.fashion.test.model;\n\nimport com.github.fashion.test.groups.EditGroup;\nimport com.github.fashionbrot.validated.annotation.NotEmpty;\nimport com.github.fashionbrot.validated.annotation.NotNull;\nimport lombok.Data;\n\n@Data\npublic class GroupModel {\n\n\n    private String abc;\n\n    @NotNull(msg = \"id 不能为空\",groups = {EditGroup.class})\n    private Long id;\n\n    @NotEmpty(msg = \"name 不能为空\")\n    private String name;\n\n}\n\n```\n\n\n\n\n\n\n\n\n\n\n\n## ** 自定义注解看这里 **\n```java\n@RequestMapping(\"/valid/bean\")\n@Controller\npublic class ValidBeanController {\n\n    @RequestMapping(\"/test\")\n    @ResponseBody\n    @Validated\n    public String test(@CustomBean ValidBeanModel validBeanModel){\n        return validBeanModel.getA1()+validBeanModel.getA2();\n    }\n}\n```\n#### 定义注解\n```java\npackage com.github.fashion.test.annotation;\n\nimport com.github.fashionbrot.validated.constraint.Constraint;\n\nimport java.lang.annotation.*;\n\n@Documented\n@Target({ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\n@Constraint(validatedBy = {CustomBeanConstraintValidatorBean.class}) //设置自定义注解实现类\npublic @interface CustomBean {\n\n    String msg() default \"CustomBean 验证失败\";\n\n    /**\n     * true 快速失败\n     * @return boolean\n     */\n    boolean failFast() default true;\n}\n```\n#### 自定义注解实现\n```java\npackage com.github.fashion.test.annotation;\n\n\nimport com.github.fashion.test.model.ValidBeanModel;\nimport com.github.fashionbrot.validated.constraint.ConstraintValidator;\nimport com.github.fashion.test.test.CustomModel;\nimport com.github.fashionbrot.validated.exception.ValidatedException;\nimport com.github.fashionbrot.validated.util.ExceptionUtil;\nimport com.github.fashionbrot.validated.util.ObjectUtil;\nimport lombok.Data;\n\nimport java.util.StringJoiner;\n\npublic class CustomBeanConstraintValidatorBean implements ConstraintValidator\u003cCustomBean, Object\u003e {\n\n    @Override\n    public boolean isValid(CustomBean annotation, Object value, Class\u003c?\u003e valueType) {\n        if (value instanceof ValidBeanModel){\n            ValidBeanModel beanModel= (ValidBeanModel) value;\n            StringJoiner msg=new StringJoiner(\",\");\n            if (ObjectUtil.isEmpty(beanModel.getA1())){\n                msg.add(\"A1 不能为空\") ;\n                if (annotation.failFast()){\n                    ValidatedException.throwMsg(\"A1\",msg.toString());\n                }\n            }\n            if (ObjectUtil.isEmpty(beanModel.getA2())){\n                msg.add(\"A2 不能为空\") ;\n                if (annotation.failFast()){\n                    ValidatedException.throwMsg(\"A2\",msg.toString());\n                }\n            }\n            if (msg.length()\u003e0){\n                ValidatedException.throwMsg(\"req\",msg.toString());\n            }\n        }\n        return true;\n    }\n    @Override\n    public Object modify(CustomBean annotation, Object value, Class\u003c?\u003e valueType) {\n        System.out.println(\"CustomConstraintValidator:\"+value);\n        if (value instanceof ValidBeanModel){\n            ValidBeanModel beanModel= (ValidBeanModel) value;\n            beanModel.setA1(\"1\");\n            beanModel.setA2(\"2\");\n            return beanModel;\n        }if (value instanceof CustomModel){\n            CustomModel customModel=(CustomModel)value;\n            if (customModel!=null){\n                customModel.setAbc(\"在 valid modify 中修改的abc\");\n            }\n            return customModel;\n        }\n        return value;\n    }\n\n}\n\n```\n\n\n## 支持 国际化消息提示（现支持中英文两种）其他语言，请按照 mars-validated  resources 下面的 valid_zh_CN.properties 添加其他语言\n```html\n请求：http://localhost:8080/l18n/test?lang=en_us\n提示：must not be empty\n请求:http://localhost:8080/l18n/test?lang=zh_CN\n提示：不能为空\n```\n```java\n\n@RequestMapping(\"/l18n\")\n@Controller\npublic class I18nController {\n\n    @RequestMapping(\"/test\")\n    @ResponseBody\n    @Validated\n    public String test(@NotEmpty() String abc){\n        return abc;\n    }\n\n}\n```\n\n\n## 支持 dubbo 接口、实现类上方法上添加 @Validated ,设置 dubbo DubboProviderFilter 拦截器做统一处理\n\n```java\n\npublic class DubboProviderFilter implements Filter {\n\n    @Override\n    public Result invoke(Invoker\u003c?\u003e invoker, Invocation invocation) throws RpcException {\n        Result result =  invoker.invoke(invocation);\n        if(result.hasException() \u0026\u0026 result.getException() instanceof ValidationException){\n            throw new CustomException(result.getException()); //自定义异常，全局拦截控制,或抛出 RpcException 自行拦截\n        }\n        return result;\n    }\n}\n```\n\n\n\n\n####  使用参数验证方式@Validated 开启接口验证 @Email验证邮箱格式,其他注解不在一一介绍\n\n```bash\n@Controller\npublic class DemoController {\n\n    @Autowired\n    private TestService testService;\n\n    @RequestMapping(\"/emailCheck\")\n    @ResponseBody\n    @Validated //注意此处\n    public String demo(@Email String abc,){\n        return testService.test(abc);\n    }\n}\n@Controller\npublic class DemoController {\n\n    @Autowired\n    private TestService testService;\n\n    @RequestMapping(\"/idcardCheck\")\n    @ResponseBody\n    @Validated //注意此处\n    public String demo(IdCardModel idCardModel){\n        return testService.test(\"ac\");\n    }\n}\n\n\n**此处支持多继承验证***\n\npublic class IdCardModel extends BaseModel{\n\n    @IdCard\n    private String idCardModel;\n\n    public String getIdCardModel() {\n        return idCardModel;\n    }\n\n    public void setIdCardModel(String idCardModel) {\n        this.idCardModel = idCardModel;\n    }\n}\n\n@Service\npublic class TestService{\n    @Validated\n    public void test2(@IdCard String abc){\n\n    }\n}\n\n```\n\n#### 按照 @Validated(groups = {EditGroup.class}) valid 校验\n```java\n@Controller\npublic class DemoController {\n     @RequestMapping(\"/test1\")\n     @ResponseBody\n     @Validated(groups = {EditGroup.class})\n     public String test1( @Custom(min = 1,groups = {EditGroup.class,AddGroup.class}) String abc1){\n         return abc1;\n     }\n\n\n     @RequestMapping(\"/test2\")\n     @ResponseBody\n     @Validated(groups = AddGroup.class)\n     public String test2(GroupModel groupModel){\n         return groupModel.getAbc();\n     }\n}\n```\n\n\n#### 可通过项目中的 https://github.com/fashionbrot/mars-validated/tree/master/mars-validated-test 参考使用demo\n#### 如有问题请通过 https://github.com/fashionbrot/mars-validated/issues 提出 告诉我们。我们非常认真地对待错误和缺陷，在产品面前没有不重要的问题。不过在创建错误报告之前，请检查是否存在报告相同问题的issues。\n\n\n### 如有问题请联系邮箱 fashionbrot@163.com 反馈问题\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffashionbrot%2Fmars-validated","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffashionbrot%2Fmars-validated","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffashionbrot%2Fmars-validated/lists"}