{"id":19337324,"url":"https://github.com/infobip/infobip-bean-validation","last_synced_at":"2025-04-23T01:30:59.211Z","repository":{"id":46766744,"uuid":"105653637","full_name":"infobip/infobip-bean-validation","owner":"infobip","description":"Library which provides new features on top of Hibernate Validator and Spring Boot Validation starter.","archived":false,"fork":false,"pushed_at":"2023-06-02T20:22:55.000Z","size":86,"stargazers_count":13,"open_issues_count":0,"forks_count":4,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-02T06:12:23.966Z","etag":null,"topics":["bean-validation","java","spring","spring-boot"],"latest_commit_sha":null,"homepage":null,"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/infobip.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":"2017-10-03T13:14:40.000Z","updated_at":"2023-10-17T10:18:53.000Z","dependencies_parsed_at":"2024-11-10T03:14:08.952Z","dependency_job_id":"49875139-a69c-4b59-b9a2-8ed6165942c1","html_url":"https://github.com/infobip/infobip-bean-validation","commit_stats":null,"previous_names":["infobip/infobip-spring-bean-validation"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infobip%2Finfobip-bean-validation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infobip%2Finfobip-bean-validation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infobip%2Finfobip-bean-validation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infobip%2Finfobip-bean-validation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/infobip","download_url":"https://codeload.github.com/infobip/infobip-bean-validation/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250352207,"owners_count":21416454,"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","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":["bean-validation","java","spring","spring-boot"],"created_at":"2024-11-10T03:14:04.678Z","updated_at":"2025-04-23T01:30:58.909Z","avatar_url":"https://github.com/infobip.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Infobip Bean Validation\n\n![](https://github.com/infobip/infobip-bean-validation/workflows/maven/badge.svg)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.infobip/infobip-bean-validation-spring-boot-starter/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.infobip/infobip-bean-validation-spring-boot-starter)\n[![Coverage Status](https://coveralls.io/repos/github/infobip/infobip-bean-validation/badge.svg?branch=master)](https://coveralls.io/github/infobip/infobip-bean-validation?branch=master)\n\nLibrary which provides new features on top of Hibernate Validator and Spring Boot Validation starter.\n\n## Contents\n\n1. [Features and examples](#FeaturesAndExamples)\n    * [Basic](#Basic)\n    * [SimpleConstraintValidator](#SimpleConstraintValidator)\n    * [ConstraintViolationException mapping](#ConstraintViolationExceptionMapping)\n    * [Hibernate Validator Configuration Strategy](#HibernateValidatorConfigurationStrategy)\n    * [Validator bean injection](#ValidatorBeanInjection)\n    * [Decoupling of validation annotations and validators](#DecouplingOfValidationAnnotationsAndValidators)\n2. [Requirements](#Requirements)\n3. [Contributing](#Contributing)\n4. [License](#License)\n\n\u003ca id=\"FeaturesAndExamples\"\u003e\u003c/a\u003e\n##  Features and examples:\n\n\u003ca id=\"Basic\"\u003e\u003c/a\u003e\n### Basic:\n\n - Auto configuration - no manual configuration required\n - predefined validation groups - Create, Update, Delete\n - predefined validation sequence - ExpensiveSequence\n - Out of the box composed annotations: @ValidatedService, @ValidatedRestController\n\n\u003ca id=\"ConstraintViolationExceptionMapping\"\u003e\u003c/a\u003e\n###  ConstraintViolationException mapping:\n\nTo remap all ConstraintViolationExceptions to a custom exception simply declare a bean of ConstraintViolationExceptionMapper type:\n\n```java\n@Bean\npublic ConstraintViolationExceptionMapper\u003cIllegalArgumentException\u003e constraintViolationExceptionMapper() {\n    return e -\u003e new IllegalArgumentException(e.getMessage());\n}\n```\n\n\u003ca id=\"HibernateValidatorConfigurationStrategy\"\u003e\u003c/a\u003e\n### Hibernate Validator Configuration Strategy:\n\nBy defining a bean of type HibernateConfigurationStrategy you can programmatically alter Hibernate Validator configuration:\n\n```java\n@Bean\npublic HibernateValidatorConfigurationStrategy hibernateValidatorConfigurationStrategy() {\n    return configuration -\u003e configuration.clockProvider(Clock::systemUTC);\n}\n```\n\n\u003ca id=\"SimpleConstraintValidator\"\u003e\u003c/a\u003e\n### SimpleConstraintValidator:\nBean Validation's `ConstraintValidator` defines two abstract methods, `initialize(A constraintAnnotation)` and \n`isValid(T value, ConstraintValidatorContext context)`.\nFor most cases, `initialize` is not used and is implemented as empty method. Also, `isValid` expects you to treat null \nvalue as valid. Both of these shortcomings are handled by `SimpleConstraintValidator` which is a `FunctionalInterface` \n(lambdas!) and only requires you to implement `isValid(T value)` (value passed to implementation is never null).\nAn example of an implementation using `ConstraintValidator`:\n\n```java\n@Component\npublic class FileNameValidator implements ConstraintValidator\u003cFileName, String\u003e {\n \n    private static final char[] forbiddenCharacters = ...;\n \n    @Override\n    public void initialize(FileName constraintAnnotation) {\n    }\n \n    @Override\n    public boolean isValid(String value, ConstraintValidatorContext context) {\n        if (value == null) {\n            return true;\n        }\n \n        return !StringUtils.containsAny(value, forbiddenCharacters);\n    }\n} \n```\n\nAs you can see, null check and initialize method implementation make a lot of useless noise.\nSame example using SimpleConstraintValidator:\n\n```java\n@Component\npublic class FileNameValidator implements SimpleConstraintValidator\u003cFileName, String\u003e {\n \n    private static final char[] forbiddenCharacters = ...;\n \n    @Override\n    public boolean isValid(String value) {\n        return !StringUtils.containsAny(value, forbiddenCharacters);\n    }\n}\n```\n\n\u003ca id=\"ValidatorBeanInjection\"\u003e\u003c/a\u003e\n### Validator bean injection:\n\nThis feature is provided by Spring and details can be found in [official Spring documentation](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation-beanvalidation-spring-constraints).\nExample:\n\n```java\n@Component\npublic class ValidExpirationTimeValidator implements SimpleConstraintValidator\u003cValidExpirationTime, Date\u003e {\n \n    private final Clock clock;\n \n    public ValidExpirationTimeValidator(Clock clock) {\n        this.clock = clock;\n    }\n \n    @Override\n    public boolean isValid(Date value) {\n \n        ... validation logic that uses injected clock\n    }\n}\n```\n\n\u003ca id=\"DecouplingOfValidationAnnotationsAndValidators\"\u003e\u003c/a\u003e\n### Decoupling of validation annotations and validators:\n\nThis feature is provided by Hibernate Validator and details can be found in [official Hibernate Validator documentation](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-programmatic-constraint-definition).\nUsed for use cases where you don't want to provide a default implementation for your custom validation annotation and want to register it programmatically. For example, validator and validation annotation are in different artifacts.\n\nFor example, lets say we have a custom validation annotation MustNotBeTopSecret (note the empty validatedBy) and validator MustNotBeTopSecretValidator:\n\nAnnotation:\n```java\n@Target(ElementType.FIELD)\n@Retention(RetentionPolicy.RUNTIME)\n@Constraint(validatedBy = {}) // EMPTY!\n@Documented\npublic @interface MustNotBeTopSecret {\n \n    String message() default \"must not be top secret\";\n \n    Class\u003c?\u003e[] groups() default {};\n \n    Class\u003c? extends Payload\u003e[] payload() default {};\n \n}\n```\nValidator:\n```java\n@Component\npublic class MustNotBeTopSecretValidator implements ConstraintValidator\u003cMustNotBeTopSecret, String\u003e {\n \n    private final TopSecretService topSecretService;\n \n    @Autowired\n    public MustNotBeTopSecretValidator(TopSecretService topSecretService) {\n        this.topSecretService = topSecretService;\n    }\n \n    ... isValid and initialize implementations\n}\n```\n\nCustom validators are automatically injected into Hibernate Validator Configuration, here's an example of how you'd do it manually:\n\n```java\n@Bean\npublic HibernateConfigurationStrategy hibernateConfigurationStrategy() {\n    return configuration -\u003e configuration.createConstraintMapping()\n                                         .constraintDefinition(MustNotBeTopSecret.class)\n                                         .validatedBy(MustNotBeTopSecretValidator.class);\n}\n```\n\n\u003ca id=\"Requirements\"\u003e\u003c/a\u003e\n##  Requirements:\n\n- Java 17\n- Hibernate Validator\n- Spring Boot (without Boot you will have to import BeanValidationAutoConfiguration manually)\n\n\u003ca id=\"Contributing\"\u003e\u003c/a\u003e\n## Contributing\n\nIf you have an idea for a new feature or want to report a bug please use the issue tracker.\n\nPull requests are welcome!\n\n\u003ca id=\"License\"\u003e\u003c/a\u003e\n## License\n\nThis library is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfobip%2Finfobip-bean-validation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finfobip%2Finfobip-bean-validation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfobip%2Finfobip-bean-validation/lists"}