Spring Boot 기능 통합 의 실현
기 존 에 했 던 Nest.js 백 엔 드 프로젝트 기능 을 기준 으로 한다 면 Spring Boot 프로젝트 는 몇 가지 기능 을 통합 시 켜 야 합 니 다.생태 가 풍부 하고 통합 도 어렵 지 않 습 니 다.그래서 이전 프로젝트 에 따라 Spring Boot 를 사용 하여 새로운 프로젝트 를 다시 쓰 려 고 합 니 다.
Restful API CRUD 기능 구현데이터베이스 대상 관계 맵 기능 지속 화 지원
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 기능 통합 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.