当前位置: 首页 > article >正文

java抽奖系统(二)

 3. 新建项目

3.1 选择相应的框架

pom文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>lottery_system</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>lottery_system</name>
    <description>lottery_system</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


3.2 代码结构设计

分层结构如下:

 

4. 功能模块设计

4.1 错误码

        我们对dao层不进行定义错误码;

对controller层和servoce层进行定义错误码;

对于一个全局的错误码,成功,失败,未知;

代码如下:

package com.example.lotterysystem.common;

/**
 * @version 1.0
 * @Author 作者名
 * @Date 2024/11/24 19:55
 * @注释
 */
public interface GlobalErrorCodeConstants {
    ErrorCode SUCCESS = new ErrorCode(200,"成功!");
    ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500,"系统异常!");
    ErrorCode UNKNOW = new ErrorCode(101,"未知错误!");
}

4.2 ⾃定义异常类

根据控制层和服务层来分别写相应的代码,其实两部分的代码都相近,同时引入了@EqualsAndHashCode(callSuper = true)注解:

@Data
@EqualsAndHashCode(callSuper = true)
public class ControllerException extends RuntimeException{
    /**
     * @see com.example.lotterysystem.common.errcode.ControllerErrorCodeConstants
     */
    private int code;//异常吗
    private String message;//异常消息

    //为了序列化
    public ControllerException(){
    }

    public ControllerException(Integer code,String message){
        this.code = code;
        this.message = message;
    }

    public ControllerException(ErrorCode errorCode){
        this.code = errorCode.getCode();
        this.message= errorCode.getMessage();
    }
}

4.3. CommonResult<T>

        CommonResult<T>作为控制器层⽅法的返回类型,封装HTTP接⼝调⽤的结果,包括成功数据、错 误信息和状态码。它可以被SpringBoot框架等⾃动转换为JSON或其他格式的响应体,发送给客⼾端。

关于为什么要封装?

1. 统⼀的返回格式:确保客⼾端收到的响应具有⼀致的结构,⽆论处理的是哪个业务逻辑。 2. 错误码和消息:提供错误码(code)和错误消息(msg),帮助客⼾端快速识别和处理错误。

3. 泛型数据返回:使⽤泛型允许返回任何类型的数据,增加了返回对象的灵活性。

4. 静态⽅法:提供了error()和success()静态⽅法,⽅便快速创建错误或成功的响应对象。

5. 错误码常量集成:通过ErrorCode和GlobalErrorCodeConstants使⽤预定义的错误码,保持错 误码的⼀致性和可维护性。

6. 序列化:实现了Serializable接⼝,使得CommonResult对象可以被序列化为多种格式,如 JSON或XML,⽅便⽹络传输。

7. 业务逻辑解耦:将业务逻辑与API的响应格式分离,使得后端开发者可以专注于业务逻辑的实 现,⽽不必关⼼如何构建HTTP响应。

8. 客⼾端友好:客⼾端开发者可以通过统⼀的接⼝获取数据和错误信息,⽆需针对每个API编写特 定的错误处理逻辑。

@Data
//因为时进行http传输,为了成功传输就要进行序列化
public class CommonResult<T> implements Serializable {
    private Integer code;

    private T data;

    private String message;

    public static  <T> CommonResult<T> success(T data){
        CommonResult<T> result = new CommonResult<>();
        result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
        result.data = data;
        result.message = "";
        return result;
    }

    public static  <T> CommonResult<T> error(Integer code,String message){
        Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code),
                "code不是错误的异常");
        CommonResult<T> result = new CommonResult<>();
        result.code = code;
        result.message = message;
        return result;
    }

    public static  <T> CommonResult<T> error(ErrorCode errorCode){
        return error(errorCode.getCode(),errorCode.getMessage());
    }

}

ps:未完待续


http://www.kler.cn/a/408471.html

相关文章:

  • 【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解
  • 从零开始-VitePress 构建个人博客上传GitHub自动构建访问
  • 【C++】ReadFile概述,及实践使用时ReadFile的速率影响研究
  • autogen+ollama+litellm实现本地部署多代理智能体
  • 分公司如何纳税
  • HashMap源码详解
  • java 二分查找 方法 详解
  • 一文学会Golang里拼接字符串的6种方式(性能对比)
  • 【jvm】java对象头
  • C指针之舞——指针探秘之旅(2)
  • CentOS 7安装SSHFS 实现远程主机目录 挂载为本地目录
  • 计网-命令行实现收发邮件
  • 【算法】BFS解决最短路径问题
  • Python脚本消费多个Kafka topic
  • WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理
  • Spring Boot OA管理系统:提升企业运营效率
  • 【Stable Diffusion】 超大尺寸绘制、分区控制,详解Tiled Diffusion VAE插件功能
  • 人工智能大趋势下软件开发的未来
  • 【论文复现】BERT模型解读与简单任务实现
  • RabbitMQ3:Java客户端快速入门
  • MariaDB面试题及参考答案
  • 【OpenGL】GLFW环境配置 + 扩展GLFW使其可以成为MFC子窗口
  • C0033.在Ubuntu中配置clion的环境
  • 数据集-目标检测系列- 安全背心 检测数据集 safety_vests >> DataBall
  • docker desktop上下载的镜像传到虚拟机上使用
  • Python编程整理汇总(基础汇总版)