广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Boot 功能整合的实现
  • 574
分享到

Spring Boot 功能整合的实现

2024-04-02 19:04:59 574人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言数据库持久化支持swagger 文档支持参数校验 jsR303跨域解决整合mongoDB实现文件上传下载删除前言 如果根据之前做的 Nest.js 后端项目功能为标准的话,

前言

如果根据之前做的 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 即可访问。值得注意是如果你在 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;


@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);
}

不过默认返回的异常信息并不是很友好,需要再次简化,所以需要做个全局异常处理。如果需要可以使用 @RestControllerAdvice 注解来表示全局处理类:



@ControllerAdvice
public class ExceptionHandlerConfig {

    
    @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 重写方法即可:



@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsReGIStry corsRegistry) {
        corsRegistry.addMapping("
@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");

    
    @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("文件上传异常");
        }
    }


    
    @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);
        }
    }

    
    @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 功能整合的资料请关注编程网其它相关文章!

--结束END--

本文标题: Spring Boot 功能整合的实现

本文链接: https://www.lsjlt.com/news/126945.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Boot 功能整合的实现
    目录前言数据库持久化支持Swagger 文档支持参数校验 JSR303跨域解决整合MongoDB实现文件上传下载删除前言 如果根据之前做的 Nest.js 后端项目功能为标准的话,...
    99+
    2022-11-12
  • Spring Boot 整合RocketMq实现消息过滤功能
    目录简介根据TAG过滤消息生产者消费者测试结果根据SQL表达式过滤消息生产者消费者启动程序报错The broker does not support consumer to filt...
    99+
    2022-11-13
  • SpringBoot详解整合Spring Boot Admin实现监控功能
    目录监控监控的意义可视化监控平台监控原理自定义监控指标监控 ​ 在说监控之前,需要回顾一下软件业的发展史。最早的软件完成一些非常简单的功能,代码不多,错误也少。随着软件功能的逐步完善...
    99+
    2022-11-13
  • Spring boot 整合 Redisson实现分布式锁并验证功能
    目录简述1. 在idea中新建spring boot工程并引入所需依赖2. 编写相关代码实现3. 模拟实际环境验证3.1 下载idea的docker插件并配置相关镜像信息3.2 将s...
    99+
    2022-11-13
  • Spring Boot整合JWT的实现步骤
    springboot整合jwt步骤: 1、登录时,验证账号和密码成功后,生成jwt,返回给前端; 2、前端接收后保存,再做其他操作,比如增删改查时,同时将jwt传给后端进行验证,如果...
    99+
    2022-11-12
  • Spring Boot 整合Redis 实现优惠卷秒杀 一人一单功能
    目录一、什么是全局唯一ID⛅全局唯一ID⚡Redis实现全局唯一ID二、环境准备三、实现秒杀下单四、库存超卖问题⏳问题分析⌚ 乐观锁解决库存超卖✅Jmeter 测试五、优惠卷秒杀 实现一人一单⛵小结一、什么是全局唯一ID...
    99+
    2022-09-19
  • Spring Boot 整合Redis 实现优惠卷秒杀 一人一单功能
    目录一、什么是全局唯一ID⛅全局唯一ID⚡Redis实现全局唯一ID二、环境准备三、实现秒杀下单四、库存超卖问题⏳问题分析⌚ 乐观锁解决库存超卖✅Jmeter 测试五、优惠卷秒杀 实...
    99+
    2022-11-13
  • spring boot如何实现对RabbitMQ整合
    本篇文章为大家展示了spring boot如何实现对RabbitMQ整合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.Fanout Exchange介绍Fanout Exchange 消息广播的...
    99+
    2023-05-31
    springboot rabbitmq bit
  • 使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter
    使用spring-boot如何实现整合dubbo中的Spring-boot-dubbo-starter?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在application.p...
    99+
    2023-05-31
    springboot art dubbo
  • Spring Boot 整合 Reactor实例详解
    目录引言1 创建项目2 集成 H2 数据库3 创建测试类3.1 user 实体3.2 UserRepository3.3 UserService3.4 UserController3...
    99+
    2022-11-13
  • Spring Boot 整合 Thymeleaf 实例分享
    目录一、什么是 Thymeleaf二、整合过程准备过程添加 Thymeleaf 依赖编写实体类和 Controller创建Thymeleaf 模板三、测试一、什么是 Thymelea...
    99+
    2022-11-13
  • Spring Boot 整合 FreeMarker 实例分享
    目录一、前言二、FreeMarker 简介三、准备工作环境准备添加 FreeMarker 依赖添加 FreeMarker 相关配置四、编写实体类和 Controller编写实体类编写...
    99+
    2022-11-13
  • Spring + Spring Boot + MyBatis + MongoDB的整合教程
    前言我之前是学Spring MVC的,后面听同学说Spring Boot挺好用,极力推荐我学这个鬼。一开始,在网上找Spring Boot的学习资料,他们博文写得不是说不好,而是不太详细。我就在想我要自己写一篇尽可能详细的文章出来,下面话不...
    99+
    2023-05-30
    springboot mybatis mongodb
  • 使用Spring Boot实现对RabbitMQ整合的方法
    本篇文章给大家分享的是有关使用Spring Boot实现对RabbitMQ整合的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.Topic交换器介绍Topic Excha...
    99+
    2023-05-31
    springboot rabbitmq
  • 使用Spring Boot如何实现对MyBatis的整合
    本篇文章为大家展示了使用Spring Boot如何实现对MyBatis的整合,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.加入mybatis-spring-boot-stater的Maven依赖...
    99+
    2023-05-31
    springboot mybatis
  • spring boot整合hessian的示例
    首先添加hessian依赖<dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifac...
    99+
    2023-05-31
    spring boot hessian
  • JavaMail整合Spring实现邮件发送功能
    简介 javaMail与spring整合完成后,可大大加大邮件发送效率。当服务器一启动,配置文件就已加载。直接保存用户信息时,邮件可直接发送,大大提高了效率。 1.引入坐标 <...
    99+
    2022-11-13
    JavaMail Spring 邮件发送
  • Spring Boot整合mybatis(一)实例代码
    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置。接下来开始spring-boot与mybatis的整合。创建一个maven工程命名为spring-boot-entity,pom.xml文件配置如下:&l...
    99+
    2023-05-31
    spring boot 整合
  • SpringBoot整合Spring Boot Admin实现服务监控的方法
    目录1. Server端服务开发1.1. 引入核心依赖1.2. application.yml配置文件1.3. Security配置文件1.4. 主启动类2. Client端服务开发...
    99+
    2022-11-13
  • vue+spring boot实现校验码功能
    本文实例为大家分享了vue+spring boot实现校验码功能的具体代码,供大家参考,具体内容如下 用vue写了一个校验码来玩玩,样子如下: 1.img标签 <img ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作