跳转至

SpringBoot常见YML配置、配置类和工具类代码参考

约 85 个字 308 行代码 预计阅读时间 4 分钟

SpringBoot/SpringCloud YML常见配置项参考

YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
spring:
  application:
    name: book-manager
  servlet:
    multipart:
      max-file-size: 5MB      # 单个文件最大5MB
      max-request-size: 10MB  # 整个请求最大10MB
  datasource:
    url: jdbc:mysql://localhost:3306/book_manager?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  rabbitmq:
    addresses: amqp://admin:admin@ip:port/blog
    listener:
      simple:
        acknowledge-mode: manual # 手动确认
  data:
    redis:
      host: 47.113.217.80
      port: 6376
      timeout: 60s
      lettuce:
        pool:
          max-active: 8
          max-idle: 8
          min-idle: 0
          max-wait: 5s
  mail:
    host: smtp.qq.com
    username: 1848312235@qq.com
    password: xxxx
    port: 465
    properties:
      mail.smtp.ssl.enable: true
      personal: "图书管理系统"
  ai:
    openai:
      api-key: xxx
      base-url: https://api.deepseek.com
      chat:
        options:
          model: deepseek-chat
          temperature: 0.7
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# ⽇志配置
logging: 
  pattern:
    dateformat: HH:mm:ss 
  level:
    root: info # 默认⽇志级别
    com.epsda.book.controller: debug # 指定包的⽇志级别
# 自定义Hutools验证码配置
captcha:
  width: 100
  height: 40
  session:
    key-name: captcha-key
    date-name: captcha-date
# 自定义头像上传地址
avatar:
  upload:
    path: E:\BookManager\backend\images
# 自定义管理员名称
admin:
  admin-name: book_admin_001
# 自定义跨域地址配置
app:
  cors:
    allowed-origins: http://localhost:9999,http://127.0.0.1:9999

SpringBoot统一返回结果包装

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public record Constants() {
    public static final Integer NORMAL = 0;
    public static final Integer SERVER_ERROR = 1;
    public static final Integer SYSTEM_ERROR = 2;
    public static final Integer RESOURCE_NOT_FOUND = 3;
    public static final String SERVER_ERROR_MESSAGE = "服务器异常";
    public static final String SYSTEM_ERROR_MESSAGE = "图书管理系统异常";
    public static final String RESOURCE_NOT_FOUND_MESSAGE = "资源不存在"; 
}

@Data
@AllArgsConstructor
public class ResultWrapper<T> {
    private Integer code;
    private String errMsg;
    private T data;

    // 正常情况
    public static <T> ResultWrapper<T> normal(T data) {
        return new ResultWrapper<>(Constants.NORMAL, "", data);
    }

    // 错误情况
    public static <T> ResultWrapper<T> fail(T data) {
        return new ResultWrapper<>(Constants.SERVER_ERROR, "", data);
    }

    public static <T> ResultWrapper<T> fail(Integer code, String errMsg) {
        return new ResultWrapper<>(Constants.SERVER_ERROR, errMsg, null);
    }

    public static <T> ResultWrapper<T> fail(String errMsg, T data) {
        return new ResultWrapper<>(Constants.SERVER_ERROR, errMsg, data);
    }
}

SpringBoot统一异常

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Slf4j
@ControllerAdvice
@ResponseBody // 防止出现持续返回视图导致的死循环情况
public class ExceptionAdvice {
    @ResponseStatus(value = HttpStatus.SERVICE_UNAVAILABLE)
    @ExceptionHandler(Exception.class)
    public ResultWrapper allExcetionHandler(Exception e) {
        log.info("出现异常:{}", e.getMessage());
        MethodArgumentNotValidException methodValidationException = null;
        if (e instanceof MethodArgumentNotValidException) {
            methodValidationException = (MethodArgumentNotValidException) e;
        }
        String errMsg = e.getMessage();
        if (methodValidationException != null) {
            errMsg = methodValidationException.getBindingResult().getFieldError().getDefaultMessage();
        }

        return ResultWrapper.fail(Constants.SERVER_ERROR, Constants.SERVER_ERROR_MESSAGE + ":" + errMsg);
    }

    @ResponseStatus(value = HttpStatus.SERVICE_UNAVAILABLE)
    @ExceptionHandler(BookManagerException.class)
    public ResultWrapper systemExceptionHandler(Exception e) {
        log.info("出现异常:{}", e.getMessage());

        return ResultWrapper.fail(Constants.SYSTEM_ERROR, Constants.SYSTEM_ERROR_MESSAGE + ":" + e.getMessage());
    }

    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoResourceFoundException.class)
    public ResultWrapper noResourceFoundException(Exception e) {
        log.info("出现异常:{}", e.getMessage());
        return ResultWrapper.fail(Constants.RESOURCE_NOT_FOUND, Constants.RESOURCE_NOT_FOUND_MESSAGE);
    }
}

SpringBoot统一跨域解决

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Value("${app.cors.allowed-origins}") // 参考通用配置文件
    private String allowedOrigins;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        String[] origins = allowedOrigins.split(",");
        registry.addMapping("/**")
                .allowedOrigins(origins)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

自定义异常参考

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Data
@EqualsAndHashCode(callSuper = true)
public class BookManagerException extends RuntimeException{
    public Integer code;
    public String message;

    public BookManagerException() {
    }

    public BookManagerException(Integer code) {
        this.code = code;
    }

    public BookManagerException(String message) {
        this.message = message;
    }

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

JSON工具类(基于FastJson)

FastJson依赖:

XML
1
2
3
4
5
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.59</version>
</dependency>

工具类:

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Slf4j
public class JsonUtil {
    // 对象转Json字符串
    public static String toJson(Object o) {
        try {
            return o == null ? null : JSON.toJSONString(o);
        } catch (Exception e) {
            log.error("对象转JSON字符串出现异常,e:{}", e.getMessage());
            return null;
        }
    }

    // Json字符串转对象
    public static <T> T toObject(String json, Class<T> cls) {
        try {
            if (cls == null || !StringUtils.hasLength(json)) {
                return null;
            }
            return JSON.parseObject(json, cls);
        } catch (Exception e) {
            log.error("JSON字符串转对象出现异常,e:{}", e.getMessage());
            return null;
        }
    }
}

Jwt工具类

引入依赖:

XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.12.3</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.12.3</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.12.3</version>
    <scope>runtime</scope>
</dependency>

工具类:

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class JwtUtil {
    // 生成密钥
    private final static String secretKeySignature = "uh7Ib5KBKRwQCLal4ziR1UmsVJ07FirkpEJl10JFu+c=";

    // 过期时间
    private static final long EXPIRATION_TIME = 24 * 60 * 60 * 1000;

    private static SecretKey getSigningKey() {
        return Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretKeySignature));
    }

    public static String generateToken(String email, String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("email", email);
        claims.put("username", username);

        return Jwts.builder()
                .claims(claims)
                .subject(email)
                .issuedAt(new Date())
                .expiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(getSigningKey())
                .compact();
    }

    public static String extractEmail(String token) {
        return (String) extractClaims(token).get("email");
    }

    public static String extractUsername(String token) {
        return (String) extractClaims(token).get("username");
    }

    public static Date extractExpiration(String token) {
        return extractClaims(token).getExpiration();
    }

    private static Claims extractClaims(String token) {
        return Jwts.parser()
                .verifyWith(getSigningKey())
                .build()
                .parseSignedClaims(token)
                .getPayload();
    }

    public static boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    public static boolean validateToken(String token, String username) {
        try {
            final String tokenUsername = extractUsername(token);
            return (tokenUsername.equals(username) && !isTokenExpired(token));
        } catch (Exception e) {
            return false;
        }
    }
}

邮件发送配置类

Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component
public class MailUtil {

    private final JavaMailSender javaMailSender;
    private final MailProperties mailProperties;

    public MailUtil(JavaMailSender javaMailSender, MailProperties mailProperties) {
        this.javaMailSender = javaMailSender;
        this.mailProperties = mailProperties;
    }

    public void sendMail(String to, String subject, String html) throws Exception {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false);
        mimeMessageHelper.setFrom(mailProperties.getUsername(), mailProperties.getProperties().get("personal"));
        mimeMessageHelper.setTo(to);
        mimeMessageHelper.setSubject(subject);
        mimeMessageHelper.setText(html, true);

        javaMailSender.send(mimeMessage);
    }
}