{"id":37020901,"url":"https://github.com/nikanique/spring-rest-framework","last_synced_at":"2026-01-14T02:27:00.700Z","repository":{"id":250354129,"uuid":"834220359","full_name":"nikanique/spring-rest-framework","owner":"nikanique","description":"Spring REST Framework (SRF) is a powerful library for Spring applications that brings the simplicity and flexibility of Django's REST Framework to Spring. SRF streamlines API development with powerful serialization, flexible filters, and seamless integration.","archived":false,"fork":false,"pushed_at":"2025-02-08T15:28:03.000Z","size":590,"stargazers_count":5,"open_issues_count":3,"forks_count":4,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-02-08T16:29:34.400Z","etag":null,"topics":["api","cqrs","data-jpa","dto","filter","generator","rest-api","security","serialization","spring","spring-boot","validation"],"latest_commit_sha":null,"homepage":"https://spring-rest-framework-tutorial.readthedocs.io/en/latest/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nikanique.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-07-26T17:25:38.000Z","updated_at":"2025-02-08T15:25:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"1ba5eb55-0eab-4131-97db-e99bde653616","html_url":"https://github.com/nikanique/spring-rest-framework","commit_stats":null,"previous_names":["nikanique/spring-rest-framework"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/nikanique/spring-rest-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikanique%2Fspring-rest-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikanique%2Fspring-rest-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikanique%2Fspring-rest-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikanique%2Fspring-rest-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikanique","download_url":"https://codeload.github.com/nikanique/spring-rest-framework/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikanique%2Fspring-rest-framework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"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":["api","cqrs","data-jpa","dto","filter","generator","rest-api","security","serialization","spring","spring-boot","validation"],"created_at":"2026-01-14T02:27:00.127Z","updated_at":"2026-01-14T02:27:00.690Z","avatar_url":"https://github.com/nikanique.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spring REST Framework\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"srf.png\" alt=\"Spring REST Framework\" width=\"50%\"\u003e\n\u003c/p\u003e\nSpring REST Framework is a powerful and flexible toolkit for building REST APIs in Spring, inspired by Django REST\nframework.\n\n## Features\n\n- **Developer-Friendly**: Simplifies API development by automatically generating web endpoints (GET, POST, PUT, PATCH)\n  for ORM entities, eliminating boilerplate code and streamlining common tasks.\n- **Serialization**: Robust and flexible serializer, seamlessly integrated with Spring Data JPA, enabling\n  easy customization of API input and output formats.\n- **Filtering**: Provides powerful and versatile filtering capabilities for querying data directly from the database.\n- **Validation**: Ensures reliable endpoint validation with a wide range of rules and supports custom validation for\n  user input.\n- **Security**: Built-in integration with Spring Security delivers secure access control, safeguarding APIs and\n  resources for authorized users.\n\n## Requirements\n\n- Java 17+\n- Spring Boot 3.0.0+\n\n## Installation\n\nTo install the Spring REST Framework, include the following dependencies in your project:\n\n```xml\n\n\u003cdependencies\u003e\n    \u003c!-- Other dependencies --\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.nikanique\u003c/groupId\u003e\n        \u003cartifactId\u003espring-rest-framework\u003c/artifactId\u003e\n        \u003cversion\u003e{latest version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n## Getting Started\n\nTo start using the library, follow these steps:\n\n1. Add the necessary dependencies to your project:\n   Add the required dependencies into your project following the installation section.\n\n2. Declare your models and repositories:\n\n   For example, declare a Student model.\n\n   ```java\n    import jakarta.persistence.Entity;\n    import jakarta.persistence.GenerationType;\n    import jakarta.persistence.Id;\n    import lombok.Data;\n     \n    @Entity\n    @Data\n    public class Student {\n       @Id\n       @GeneratedValue(strategy = GenerationType.IDENTITY)\n       private Long id;\n       private String fullName;\n       private Integer age;\n       private String major;\n      \n       @ManyToOne(fetch = FetchType.EAGER)\n       @JoinColumn(name = \"school_id\")\n       private School school;\n     \n    }\n \n   ```\n\n   Create Repository for you model.\n    ```java\n    import com.example.demo.model.Student;\n    import org.springframework.data.jpa.repository.JpaRepository;\n    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;\n    import org.springframework.stereotype.Repository;\n     \n    @Repository\n    public interface StudentRepository extends JpaRepository\u003cStudent, Long\u003e, JpaSpecificationExecutor\u003cStudent\u003e {\n    }\n    ```\n\n3. Configure your API endpoints and serializers DTO:\n   declare a DTO representing your model's field in web API.\n   ```java\n   import io.github.nikanique.springrestframework.annotation.Expose;\n   import io.github.nikanique.springrestframework.annotation.ReadOnly;\n   import io.github.nikanique.springrestframework.dto.Dto;\n   import lombok.Data;\n  \n   @Data\n   public class StudentDto extends Dto{\n  \n    @Expose(source = \"fullName\")\n    private String name;\n    private Integer age;\n    private String major;\n    \n    @Expose(source = \"school__name\")\n    private String SchoolName;    \n   \n    @ReadOnly\n    private Long id;\n   }\n   ```\n   Create your Controller by extending **GenericQueryController** which will generate List and Retrieve endpoint for\n   you.\n\n   ```java\n    import io.github.nikanique.springrestframework.web.controllers.GenericQueryController;@RequestMapping(\"/student\")\n    @RestController\n    @Tag(name = \"Student\")\n    public class StudentController extends GenericQueryController\u003cStudent, Long, StudentRepository\u003e {\n        public StudentController(StudentRepository repository) {\n            super(repository);\n        }\n      \n        @Override\n        protected Class\u003c?\u003e getDTO() {\n            return StudentDto.class;\n        }\n    }  \n   ```\n\n   Add desired filters to the endpoint by using **FilterSet** class:\n\n   ```java\n    import io.github.nikanique.springrestframework.common.FieldType;import io.github.nikanique.springrestframework.filter.FilterOperation;import io.github.nikanique.springrestframework.web.controllers.GenericQueryController;\n            \n    @RequestMapping(\"/student\")\n    @RestController\n    @Tag(name = \"Student\")\n    public class StudentController extends GenericQueryController\u003cStudent, Long, StudentRepository\u003e {\n        public StudentController(StudentRepository repository) {\n            super(repository);\n        }\n      \n        @Override\n        protected Class\u003c?\u003e getDTO() {\n            return StudentDto.class;\n        }\n       @Override\n       protected FilterSet configFilterSet() {\n            // Filters student with age greater than given value and school name contains given string\n            return FilterSet.builder()\n                   .addFilter(\"age\", FilterOperation.GREATER, FieldType.INTEGER)\n                   .addFilter(\"schoolName\",\"school__name\", FilterOperation.CONTAINS, FieldType.STRING)\n                   .build();\n         }\n  \n    }  \n    ```\n   Specify allowed fields to order the result using **configAllowedOrderByFields** method:\n\n   ```java\n    import io.github.nikanique.springrestframework.web.controllers.GenericQueryController;\n            \n    @RequestMapping(\"/student\")\n    @RestController\n    @Tag(name = \"Student\")\n    public class StudentController extends GenericQueryController\u003cStudent, Long, StudentRepository\u003e {\n        public StudentController(StudentRepository repository) {\n            super(repository);\n        }\n      \n        @Override\n        protected Class\u003c?\u003e getDTO() {\n            return StudentDto.class;\n        }\n       @Override\n       protected FilterSet configFilterSet() {\n            return FilterSet.builder()\n                    .addFilter(\"name\", \"fullName\", FilterOperation.CONTAINS, FieldType.STRING)\n                    .build();\n         }\n       \n       @Override\n       public Set\u003cString\u003e configAllowedOrderByFields() {\n        return Set.of(\"name\", \"id\");\n\n       }\n    }  \n    ```\n4. Run your application, and enjoy your APIs:\n\n![spring-rest-framework-api.png](smaple_images/spring-rest-framework-api.png)\n\n## Architecture\n\nThe framework is built on top of Spring Boot, Spring MVC, Spring Data JPA and Spring Security, providing an robust\nsuite of tools for developing REST APIs. The core components are as follows:\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"smaple_images/spring-rest-framework-architecture.jpg\" alt=\"Spring REST Framework Architecture\" width=\"90%\"\u003e\n\u003c/p\u003e\n\n## Documentation\n\nFor detailed documentation and examples, visit the\nproject's [Documentation](https://spring-rest-framework-tutorial.readthedocs.io/en/latest/).\n\n## License\n\nThis project is licensed under the BSD 3-Clause License.\n\n## Contact \u0026 Issues\n\nFor any questions or feedback, please contact the author at nikanique.org@gmail.com. If you\nencounter any problems or bugs with the library, kindly create an issue to report them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikanique%2Fspring-rest-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikanique%2Fspring-rest-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikanique%2Fspring-rest-framework/lists"}