Spring Boot 기능 통합 의 실현

머리말
기 존 에 했 던 Nest.js 백 엔 드 프로젝트 기능 을 기준 으로 한다 면 Spring Boot 프로젝트 는 몇 가지 기능 을 통합 시 켜 야 합 니 다.생태 가 풍부 하고 통합 도 어렵 지 않 습 니 다.그래서 이전 프로젝트 에 따라 Spring Boot 를 사용 하여 새로운 프로젝트 를 다시 쓰 려 고 합 니 다.
Restful API CRUD 기능 구현데이터베이스 대상 관계 맵 기능 지속 화 지원
  • OpenAPI 문서 지원
  • 파라미터 검사 판단 업무
    redis 캐 시
  • ...
  • 데이터베이스 영구 화 지원
    현재 데이터베이스 의 지속 화 는 주로 Spring Boot Jpa 와 Spring Boot Mybatis 입 니 다.JPA 의 업무 과정 을 보면 Nodejs 의 TypeORM 과 비슷 하 다.Mybatis 는 동적 Sql 을 유연 하 게 디 버 깅 할 수 있 습 니 다.어쨌든 자기 프로젝트 업무 수요 에 따라 그 기능 을 선정 하 세 요.
    MyBatis 튜 토리 얼 을 설치 하면 공식 문 서 를 조회 할 수 있 습 니 다mybatis-spring-boot-autoconfigure
    Swagger 문서 지원
    Swagger UI 문서 통합 지원 도 간단 합 니 다.생태 적 인 springfox 가 잘 만 들 었 습 니 다.의존 도 를 추가 합 니 다.
    
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-boot-starter</artifactId>
      <version>3.0.0</version>
    </dependency>
    지정 한 버 전이 필요 합 니 다.라 이브 러 리 의존 을 지정 하지 않 으 면 오류 가 발생 할 수 있 습 니 다.
    그리고 시작 방법 에 주 해 를 추가 합 니 다:
    
    @EnableOpenApi
    public class YasuoApplication {
    	public static void main(String[] args) {
        // ...
    	}
    }
    그리고 Controller 클래스 에 표 지 를 추가 합 니 다.
    
    @Api(value = "global", tags = "    ")
    @RestController
    @RequestMapping("/")
    public class AppController {
    }
    그리고 방법 에 자세 한 정 보 를 추가 합 니 다.
    
    @Api(value = "global", tags = "    ")
    @RestController
    @RequestMapping("/")
    public class AppController {
        UserService userService;
    
        @ApiOperation(value = "    ", notes = "      ")
        @PostMapping("login")
        public JSONObject login(@RequestParam("username") String username, @RequestParam("password") String password) {
            System.out.println(username);
            System.out.println(password);
            JSONObject info = new JSONObject();
            return info;
        }
    }
    시작 항목 접근:http://localhost:8080/swagger-ui 접근 가능.주의해 야 할 것 은 응용 프로그램 에 server.servlet.contextPath 옵션 을 추가 할 때 해당 하 는 필드 를 추가 하 는 것 을 기억 하 는 것 입 니 다.
    파라미터 검사 JSR 303
    springboot-2.3 부터 검사 패 키 지 는 starter 구성 요소 로 독립 되 었 습 니 다.
    
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    예 를 들 어 DTO 클래스 에서:
    
    package com.iiong.yasuo.dto;
    
    import lombok.Data;
    
    import javax.validation.constraints.NotEmpty;
    
    /**
     * Author: Jaxson
     * Description:         
     * Date: 2021-05-26
     */
    @Data
    public class UserLoginRequestDTO {
        @NotEmpty(message = "        !")
        private String username;
    
        @NotEmpty(message = "        !")
        private String password;
    }
    내 장 된 검사 주 해 는 공식 문 서 를 보고 매개 변수 검 사 를 할 수 있 습 니 다.
    
    @ApiOperation(value = "    ", notes = "      ")
    @PostMapping("login")
    public RestfulModel<UserLoginResponseDTO> login(@RequestBody @Validated UserLoginRequestDTO userLoginRequestDTO) {
        System.out.println(userLoginRequestDTO);
        UserLoginResponseDTO userLoginResponseDTO = new UserLoginResponseDTO();
        userLoginResponseDTO.setId(1013401346173L);
        userLoginResponseDTO.setLoginName("112233");
        userLoginResponseDTO.setName("     ");
        userLoginResponseDTO.setToken("test");
        return new RestfulModel<>(0, "    !", userLoginResponseDTO);
    }
    그러나 기본적으로 되 돌아 오 는 이상 정 보 는 우호 적 이지 않 고 다시 간소화 해 야 하기 때문에 전역 이상 처 리 를 해 야 한다.필요 하 다 면@RestController Advice 주 해 를 사용 하여 전역 처리 클래스 를 표시 할 수 있 습 니 다.
    
    /**
     * Author: Jaxson
     * Description:        
     * Date: 2021-05-26
     */
    @ControllerAdvice
    public class ExceptionHandlerConfig {
    
        /**
         *           
         * @param bindException       
         * @return     
         */
        @ExceptionHandler(value = BindException.class)
        @ResponseBody
        public RestfulModel<Object> validExceptionHandler(BindException bindException) {
            String exceptionMsg = bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage();
            return new RestfulModel<>(1000, exceptionMsg, null);
        }
    }
    물론 이 안 에는 시스템 등급 의 이상 도 처리 할 수 있 으 니 스스로 던 지면 된다.
    크로스 오 버 해결
    크로스 필드 문 제 를 해결 하 는 것 도 간단 합 니 다.인터페이스 WebMvcConfigurer 재 작성 방법 만 실현 하면 됩 니 다.
    
    /**
     * Author: Jaxson
     * Description:     
     * Date: 2021-05-26
     */
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
        @Override
        public void addCorsMappings(CorsRegistry corsRegistry) {
            corsRegistry.addMapping("/**")
                    .allowedOriginPatterns("*")
                    .allowedHeaders(CorsConfiguration.ALL)
                    .allowedMethods(CorsConfiguration.ALL)
                    .allowCredentials(true)
                    .maxAge(3600); // 1         ( OPTIONS  )
        }
    }
    MongoDB 통합 파일 업로드 다운로드 삭제
    pom 의존 도입
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
    
    설정 yml
    
    spring:
      data:
        mongodb:
          host: *.*.*.*
          username: ***
          password: ***
          database: ***
          port: 27017
     #            
      servlet:
        multipart:
          max-file-size: 10MB
          max-request-size: 50MB
    
    업로드 다운로드 삭제
    
    /**
     * @author Mr.Horse
     * @version 1.0
     * @description: MongoDB     、  、       (  HuTool   )
     * @date 2021/4/29 9:53
     */
    @Validated
    @Controller
    @RequestMapping("/mongo")
    public class MongoUploadController {
    
        private static Logger logger = LoggerFactory.getLogger(MongoUploadController.class);
    
        @Autowired
        private GridFsTemplate gridFsTemplate;
    
        @Autowired
        private MongoTemplate mongoTemplate;
    
        private static final List<String> CONTENT_TYPES = Arrays.asList("image/gif", "image/jpeg", "image/jpg", "image/png");
    
        /**
         * MongoDB    (    )
         *
         * @param file
         * @return
         */
        @PostMapping("/upload")
        public ResponseEntity<String> fileUpload(@RequestParam("file") MultipartFile file) {
            try {
                //       (    ,    )
                String originalFilename = file.getOriginalFilename();
                if (StrUtil.isBlank(originalFilename)) {
                    return ResponseEntity.badRequest().body("    ");
                }
                String contentType = file.getContentType();
                if (!CONTENT_TYPES.contains(contentType)) {
                    return ResponseEntity.badRequest().body("      ");
                }
                InputStream inputStream = file.getInputStream();
                BufferedImage bufferedImage = ImageIO.read(inputStream);
                if (ObjectUtil.isEmpty(bufferedImage)) {
                    return ResponseEntity.badRequest().body("      ");
                }
    
                //      
                String suffix = FileNameUtil.getSuffix(originalFilename);
                String fileName = IdUtil.simpleUUID().concat(".").concat(suffix);
    
                //     ,  ObjectId
                ObjectId objectId = gridFsTemplate.store(inputStream, fileName, contentType);
                return StrUtil.isBlank(String.valueOf(objectId)) ? ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("      ") : ResponseEntity.ok(String.valueOf(objectId));
            } catch (IOException e) {
                return ResponseEntity.badRequest().body("      ");
            }
        }
    
    
        /**
         *   ObjectId          ,          ,            
         *
         * @param objectId
         */
        @GetMapping("/read")
        public void queryFileByObjectId(@RequestParam("objectId") @NotBlank(message = "ObjectId    ") String objectId, HttpServletResponse response) {
            //   objectId    
            GridFSFile file = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(objectId)));
            //        
            GridFSBucket gridFsBucket = GridFSBuckets.create(mongoTemplate.getDb());
            InputStream inputStream = null;
            OutputStream outputStream = null;
            try {
                if (ObjectUtil.isNotNull(file)) {
                    //        
                    GridFSDownloadStream fileStream = gridFsBucket.openDownloadStream(file.getObjectId());
                    //   girdFsResource,       ,     
                    GridFsResource gridFsResource = new GridFsResource(file, fileStream);
                    //      
                    inputStream = gridFsResource.getInputStream();
                    outputStream = response.getOutputStream();
                    byte[] bytes = new byte[1024];
                    if (inputStream.read(bytes) != -1) {
                        outputStream.write(bytes);
                    }
                }
            } catch (IOException e) {
                logger.error("      : {}", e.getMessage());
            } finally {
                IoUtil.close(outputStream);
                IoUtil.close(inputStream);
            }
        }
    
        /**
         *   ObjectId    
         *
         * @param objectId
         * @return
         */
        @DeleteMapping("/remove")
        public ResponseEntity<String> removeFileByObjectId(@RequestParam("objectId") @NotBlank(message = "ObjectId    ") String objectId) {
            gridFsTemplate.delete(new Query(Criteria.where("_id").is(objectId)));
            return ResponseEntity.ok("    ");
        }
    
    }
    
    브 라 우 저 페이지 에서 이 자원 을 다운로드 하 는 기능 이 필요 하 다 면 js 와 결합 하여 작업 할 수 있 습 니 다(파일 형식 은 구체 적 인 업무 수요 에 따라 정 합 니 다).주요 구현 코드 는 다음 과 같다.
    
        downloadNotes(noteId) {
          axios({
            url: this.BASE_API + '/admin/mongo/file/query/' + noteId,
            method: 'get',
            responseType: 'arraybuffer',
            params: { type: 'download' }
          }).then(res => {
            // type           ,   pdf  
            const pdfUrl = window.URL.createObjectURL(new Blob([res.data], { type: `application/pdf` }))
            const fname = noteId //        
            const link = document.createElement('a')
            link.href = pdfUrl
            link.setAttribute('download', fname)
            document.body.appendChild(link)
            link.click()
            URL.revokeObjectURL(pdfUrl) //   URL   
          })
        }
    
    이상 은 Spring Boot 기능 통합 의 실현 에 대한 상세 한 내용 입 니 다.Spring Boot 기능 통합 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기