电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Boot 功能整合的實現

瀏覽:5日期:2023-07-13 16:10:57
目錄前言數據庫持久化支持Swagger 文檔支持參數校驗 JSR303跨域解決整合MongoDB實現文件上傳下載刪除前言

如果根據之前做的 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>

這里需要指定版本,不指定拉取依賴會報錯。

然后在啟動方法添加注解:

@EnableOpenApipublic 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 即可訪問。值得注意是如果你在 application 添加 server.servlet.contextPath 選項的時候記得添加對應的字段。

參數校驗 JSR303

從 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 */@Datapublic 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);}

不過默認返回的異常信息并不是很友好,需要再次簡化,所以需要做個全局異常處理。如果需要可以使用 @RestControllerAdvice 注解來表示全局處理類:

/** * Author: Jaxson * Description: 全局異常處理類 * Date: 2021-05-26 */@ControllerAdvicepublic 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 */@Configurationpublic 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 = pdfUrllink.setAttribute(’download’, fname)document.body.appendChild(link)link.click()URL.revokeObjectURL(pdfUrl) // 釋放URL 對象 }) }

以上就是Spring Boot 功能整合的實現的詳細內容,更多關于Spring Boot 功能整合的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 合肥活动房_安徽活动板房_集成打包箱房厂家-安徽玉强钢结构集成房屋有限公司 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 探鸣起名网-品牌起名-英文商标起名-公司命名-企业取名包满意 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 间苯二酚,间苯二酚厂家-淄博双和化工| 铣床|万能铣床|立式铣床|数控铣床|山东滕州万友机床有限公司 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 天长市晶耀仪表有限公司| 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 信阳市建筑勘察设计研究院有限公司 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 换链神器官网-友情链接交换、购买交易于一体的站长平台 | 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 |