-
Notifications
You must be signed in to change notification settings - Fork 248
Home
Ramesh Fadatare edited this page Mar 16, 2023
·
1 revision
springdoc-openapi provides an integration between spring-boot and swagger-ui:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.4</version>
</dependency>
package com.springboot.blog;
import io.swagger.v3.oas.annotations.ExternalDocumentation;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Contact;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.info.License;
import org.modelmapper.ModelMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@OpenAPIDefinition(
info = @Info(
title = "Spring Boot Blog App REST APIs",
version = "v1.0",
description = "Spring Boot Blog App REST API Documentation",
contact = @Contact(
name = "Ramesh",
email = "[email protected]",
url = "https://www.javaguides.net"
),
license = @License(
name = "Apache 2.0",
url = "https://www.javaguides.net/license"
)
),
externalDocs = @ExternalDocumentation(
description = "Spring Boot Blog App Documentation",
url = "https://github.com/RameshMF/springboot-blog-rest-api"
)
)
@SpringBootApplication
public class SpringbootBlogRestApiApplication {
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
public static void main(String[] args) {
SpringApplication.run(SpringbootBlogRestApiApplication.class, args);
}
}
.requestMatchers("/swagger-ui/**").permitAll()
.requestMatchers("/v3/api-docs/**").permitAll()
You should add the @SecurityRequirement tags to your protected APIs
@PreAuthorize("hasRole('ADMIN')")
// create blog post rest api
@SecurityRequirement(name = "Bearer Authentication")
@PostMapping("/api/v1/posts")
public ResponseEntity<PostDto> createPost(@Valid @RequestBody PostDto postDto){
return new ResponseEntity<>(postService.createPost(postDto), HttpStatus.CREATED);
}
Add @SecurityScheme in SecurityConfig class:
@SecurityScheme(
name = "Bearer Authentication",
type = SecuritySchemeType.HTTP,
bearerFormat = "JWT",
scheme = "bearer"
)
package com.springboot.blog.controller;
import com.springboot.blog.payload.PostDto;
import com.springboot.blog.payload.PostResponse;
import com.springboot.blog.service.PostService;
import com.springboot.blog.utils.AppConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
import java.util.List;
@RestController
@RequestMapping()
@Tag(
name = "CRUD REST APIs for Post Resource"
)
public class PostController {
private PostService postService;
public PostController(PostService postService) {
this.postService = postService;
}
@SecurityRequirement(name = "Bearer Authentication")
@Operation(
summary = "Create Post REST API",
description = "Create Post REST API is used to save Post in database"
)
@ApiResponse(
responseCode = "201",
description = "HTTP Status 201 CREATED"
)
@PreAuthorize("hasRole('ADMIN')")
// create blog post rest api
@PostMapping("/api/v1/posts")
public ResponseEntity<PostDto> createPost(@Valid @RequestBody PostDto postDto){
return new ResponseEntity<>(postService.createPost(postDto), HttpStatus.CREATED);
}
@Operation(
summary = "Get All Posts REST API",
description = "Get All REST API is used to get all posts from database"
)
@ApiResponse(
responseCode = "200",
description = "HTTP Status 200 OK"
)
// get all posts rest api
@GetMapping("/api/v1/posts")
public PostResponse getAllPosts(
@RequestParam(value = "pageNo", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER, required = false) int pageNo,
@RequestParam(value = "pageSize", defaultValue = AppConstants.DEFAULT_PAGE_SIZE, required = false) int pageSize,
@RequestParam(value = "sortBy", defaultValue = AppConstants.DEFAULT_SORT_BY, required = false) String sortBy,
@RequestParam(value = "sortDir", defaultValue = AppConstants.DEFAULT_SORT_DIRECTION, required = false) String sortDir
){
return postService.getAllPosts(pageNo, pageSize, sortBy, sortDir);
}
@Operation(
summary = "Get Post By Id REST API",
description = "Get Post By Id REST API is used to get single post from database"
)
@ApiResponse(
responseCode = "200",
description = "HTTP Status 200 OK"
)
// get post by id
@GetMapping(value = "/api/v1/posts/{id}")
public ResponseEntity<PostDto> getPostByIdV1(@PathVariable(name = "id") long id){
return ResponseEntity.ok(postService.getPostById(id));
}
@SecurityRequirement(name = "Bearer Authentication")
@Operation(
summary = "Update Post REST API",
description = "Update Post REST API is used to update a particular post in a database"
)
@ApiResponse(
responseCode = "200",
description = "HTTP Status 200 OK"
)
@PreAuthorize("hasRole('ADMIN')")
// update post by id rest api
@PutMapping("/api/v1/posts/{id}")
public ResponseEntity<PostDto> updatePost(@Valid @RequestBody PostDto postDto, @PathVariable(name = "id") long id){
PostDto postResponse = postService.updatePost(postDto, id);
return new ResponseEntity<>(postResponse, HttpStatus.OK);
}
@Operation(
summary = "Delete Post REST API",
description = "Delete Post REST API is used to delete a particular post in a database"
)
@ApiResponse(
responseCode = "200",
description = "HTTP Status 200 OK"
)
@SecurityRequirement(name = "Bearer Authentication")
@PreAuthorize("hasRole('ADMIN')")
// delete post rest api
@DeleteMapping("/api/v1/posts/{id}")
public ResponseEntity<String> deletePost(@PathVariable(name = "id") long id){
postService.deletePostById(id);
return new ResponseEntity<>("Post entity deleted successfully.", HttpStatus.OK);
}
@GetMapping("/api/v1/posts/category/{id}")
public ResponseEntity<List<PostDto>> getPostsByCategory(
@PathVariable(name = "id") Long id) {
List<PostDto> response = postService.getPostsByCategory(id);
return new ResponseEntity< >(response, HttpStatus.OK);
}
}