Spring Boot project 第四篇-实训项目day3

本文详细介绍了如何构建一个具备用户登录、注册功能的系统,包括验证规则、异常处理、登录次数限制和冻结机制。涵盖了正则表达式验证、Spring Boot集成、数据库操作及JWT认证等关键环节。

1.搭建环境:JDK1.8+IDEA2017+MySQL8.0

2.功能要求:

登录功能:

1. 用户名为6-20位字符串,支持字母、数字;

2. 密码为8-20位字符串,支持字母、数字、特殊字符;

3. 登录失败有原因提示;

4. 5分钟内5次登录失败冻结账号10分钟;

注册功能:

1. 注册信息包括用户名、密码、手机号、出生年月、性别;

2. 用户名、手机号不可重复;

3. 用户名为6-20位字符串,支持字母、数字;

4. 密码为8-20位字符串,支持字母、数字、特殊字符;

5. 验证手机号格式;

6. 注册失败有原因提示;

3.登录实现

3.1编写UserService类

package com.example.shop.service;

import com.example.shop.model.User;

public interface UserService {

    Integer checkLoginLog(User user);

    User login(User user, String ip);

    Integer reg(User user);
}

3.2编写实现类

package com.example.shop.service.impl;

import com.example.shop.dao.LoginLogDAO;
import com.example.shop.dao.LoginLogSpecDAO;
import com.example.shop.dao.UserDAO;
import com.example.shop.model.LoginLog;
import com.example.shop.model.LoginLogExample;
import com.example.shop.model.User;
import com.example.shop.model.UserExample;
import com.example.shop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDAO userDAO;

   /* @Autowired
    private LoginLogDAO loginLogDAO;

    @Autowired
    private LoginLogSpecDAO loginLogSpecDAO;*/

    /**
     * 检查登录失败次数
     */
 /*   @Override
    public Integer checkLoginLog(User user){
        //判断该账号是否可以登录
        LoginLog loginLog = new LoginLog();
        loginLog.setUsername(user.getUsername());
        return loginLogSpecDAO.countByUsername(loginLog);
    }*/


    /**
     * 登录验证用户名和密码
     * @param user
     * @return
     */
    @Override
    public User login(User user, String ip) {
        //判断用户名密码是否存在
        UserExample userExample = new UserExample();
        userExample.createCriteria().andUsernameEqualTo(user.getUsername()).andPasswordEqualTo(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
        List<User> users = userDAO.selectByExample(userExample);

      /*  //增加登录日志
        int flag = !CollectionUtils.isEmpty(users) ? 1 : 0;
        LoginLog loginLog = new LoginLog();
        loginLog.setUsername(user.getUsername());
        loginLog.setIp(ip);
        loginLog.setLoginTime(new Date());
        loginLog.setLoginSuccess(flag);
        loginLogDAO.insertSelective(loginLog);*/

        return !CollectionUtils.isEmpty(users) ? users.get(0) : null;
    }

    /**
     * 新用户注册
     * @param user
     * @return
     */
    @Override
    public Integer reg(User user){
        //判断手机号和用户名是否重复
        UserExample ue = new UserExample();
        ue.createCriteria().andUsernameEqualTo(user.getUsername());
        ue.or().andPhoneEqualTo(user.getPhone());
        List<User> users = userDAO.selectByExample(ue);
        if(!CollectionUtils.isEmpty(users)){
            return -1;
        }

        //密码加密,增加创建时间,注册用户信息
        user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
        user.setCreatedTime(new Date());
        int rs = userDAO.insertSelective(user);

        //如果添加成功,获取刚插入的id
        if(rs > 0){
            return user.getId();
        }
        return rs;
    }
}

3.3校验功能有两种方式:第一种使用正则表达式

package com.example.shop_test.controller;


import com.example.shop_test.common.util.JwtUtils;
import com.example.shop_test.common.util.ResultModel;
import com.example.shop_test.model.User;
import com.example.shop_test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;

    /**
     * 用户登录
     * @param user
     * @return
     */
    @PostMapping("/login")
    @ResponseBody
    public ResultModel login(@RequestBody User user){
        //验证参数,也可以使用validated
        if(null == user.getUsername()){
            return ResultModel.error("请输入用户名");
        }
        String userExp = "^[A-Za-z0-9]{6,20}$";
        if(!user.getUsername().matches(userExp)) {
            return ResultModel.error("用户名为6-20位字母、数字");
        }
        if(null == user.getPassword()){
            return ResultModel.error("请输入密码");
        }
        String pwdExp = "^[A-Za-z0-9_!@#$%&*]{8,20}$";
        if(!user.getPassword().matches(pwdExp)) {
            return ResultModel.error("密码为8-20位字母、数字、特殊字符");
        }

        //调用登录方法
        User rs = userService.login(user);
        if(null == rs){
            return ResultModel.error("用户名密码错误");
        }

        //jwt 封装token返回给前端 后续接口用token验证身份
        String token = JwtUtils.createToken(rs.getId(), rs.getUsername());
        Map resultMap = new HashMap();
        resultMap.put("id", rs.getId());
        resultMap.put("token", token);
        return ResultModel.success(resultMap);

    }

    /**
     * 用户注册
     * @param user
     * @return
     */
    @PostMapping("reg")
    @ResponseBody
    public ResultModel reg(@RequestBody User user){

        Integer rs = userService.reg(user);

        if(0 == rs){
            return ResultModel.error("注册失败");
        }

        //jwt 封装token返回给前端 后续接口用token验证身份
        String token = JwtUtils.createToken(rs, user.getUsername());
        Map resultMap = new HashMap();
        resultMap.put("id", rs);
        resultMap.put("token", token);
        return ResultModel.success(resultMap);
    }
}

第二种使用注解@Validated:

步骤如下:

(1)先创建两个接口Reg和Login

package com.example.shop.common.validation.user;

/**
 * 注册校验
 */
public interface Login {
}
package com.example.shop.common.validation.user;

/**
 * 注册校验
 */
public interface Reg {
}

(2)使用这两个接口绑定@Validated注解上(@Validated(Reg.class)

(3)在model模型中绑定属性值

package com.example.shop.model;

import com.example.shop.common.validation.user.Login;
import com.example.shop.common.validation.user.Reg;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.util.Date;

public class User {
    private Integer id;

    @NotBlank(message = "用户名不能为空",groups = {Reg.class, Login.class})
    @Pattern(regexp = "^[A-Za-z0-9]{6,20}$", message = "用户名格式错误", groups = {Reg.class, Login.class})
    private String username;

    @NotBlank(message = "密码不能为空",groups = {Reg.class, Login.class})
    @Pattern(regexp = "^[A-Za-z0-9_!@#$%&*]{8,20}$", message = "密码格式错误", groups = {Reg.class, Login.class})
    private String password;

    private String nickname;

    private Date birthday;

    private Integer sex;
    
    private String phone;

    private String idcardNum;

    private Integer status;

    private Date createdTime;

    private Date modifiedTime;

    private Integer isDelete;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getIdcardNum() {
        return idcardNum;
    }

    public void setIdcardNum(String idcardNum) {
        this.idcardNum = idcardNum;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getCreatedTime() {
        return createdTime;
    }

    public void setCreatedTime(Date createdTime) {
        this.createdTime = createdTime;
    }

    public Date getModifiedTime() {
        return modifiedTime;
    }

    public void setModifiedTime(Date modifiedTime) {
        this.modifiedTime = modifiedTime;
    }

    public Integer getIsDelete() {
        return isDelete;
    }

    public void setIsDelete(Integer isDelete) {
        this.isDelete = isDelete;
    }
}

(4)导入ValidationExceptionHandler类(监听格式是否出错)

package com.example.shop.config;


import com.example.shop.common.util.ResultModel;
import com.example.shop.exception.LoginException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * validation
 */
@Slf4j
@RestControllerAdvice(basePackages = {"com.example"})
public class ValidationExceptionHandler {
    public ValidationExceptionHandler() {
    }

    @ExceptionHandler({MethodArgumentNotValidException.class})
    public ResultModel<?> validationErrorHandler(MethodArgumentNotValidException e) {
        List<String> errorInfo = e
                .getBindingResult()
                .getAllErrors()
                .stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());
        log.error(errorInfo.toString());
        return new ResultModel(401, errorInfo.toString());
    }

    @ExceptionHandler({ConstraintViolationException.class})
    public ResultModel validationParamErrorHandler(ConstraintViolationException e) {
        List<String> errorInfo = e
                .getConstraintViolations()
                .stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.toList());
        log.error(errorInfo.toString());
        return new ResultModel(402, errorInfo.toString());
    }

}

3.4编写controller类

package com.example.shop.controller;

import com.example.shop.common.util.IpUtils;
import com.example.shop.common.util.JwtUtils;
import com.example.shop.common.validation.user.Login;
import com.example.shop.common.validation.user.Reg;
import com.example.shop.model.User;
import com.example.shop.service.UserService;
import com.example.shop.common.util.ResultModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;

    /**
     * 用户登录
     * @param user
     * @return
     */
    @PostMapping("/login")
    @ResponseBody
    public ResultModel login(@Validated(Login.class) @RequestBody User user, HttpServletRequest request){
      /*  //验证是否可以登录
        Integer count = userService.checkLoginLog(user);
        if(count > 4){
            return ResultModel.error("用户禁止登录");
        }*/

        //调用登录方法
        String ip = IpUtils.getIpAddr(request);
        User rs = userService.login(user, ip);
        if(null == rs){
            return ResultModel.error("用户名密码错误");
        }

        //jwt 封装token返回给前端 后续接口用token验证身份
        String token = JwtUtils.createToken(rs.getId(), rs.getUsername());
        Map resultMap = new HashMap();
        resultMap.put("id", rs.getId());
        resultMap.put("token", token);
        return ResultModel.success(resultMap);

    }

    /**
     * 用户注册
     * @param user
     * @return
     */
    @PostMapping("reg")
    @ResponseBody
    public ResultModel reg(@Validated(Reg.class) @RequestBody User user){

        Integer rs = userService.reg(user);

        if(0 == rs){
            return ResultModel.error("注册失败");
        }else if(-1 == rs){
            return ResultModel.error("用户名或手机已存在");
        }

        //jwt 封装token返回给前端 后续接口用token验证身份
        String token = JwtUtils.createToken(rs, user.getUsername());
        Map resultMap = new HashMap();
        resultMap.put("id", rs);
        resultMap.put("token", token);
        return ResultModel.success(resultMap);
    }
}

3.5拦截器的实现

(1)编写拦截器LoginInterceptor

package com.example.shop.common.interceptor;

import com.example.shop.common.util.JwtUtils;
import com.example.shop.exception.LoginException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
@Configuration
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 验证登录状态
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            log.error("token为空或token已过期");
            throw new LoginException(400,"token为空或token已过期");
        }
        if (!JwtUtils.verify(token)) {
            log.error("token不正确");
            throw new LoginException(400, "token不正确");
        }
        String id = JwtUtils.getClaimByName(token, "id");
        String username = JwtUtils.getClaimByName(token, "username");
        request.getSession().setAttribute("id", id);
        request.getSession().setAttribute("username", username);
        return true;
    }
}

(2)定义自己的配置类 MyMvcConfig,加入拦截器

package com.example.shop.config;

import com.example.shop.common.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 列举不需要验证登录状态的接口
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/reg");
    }
}

(3)定义一个异常类LoginException

package com.example.shop.exception;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginException extends RuntimeException{
    private int code;
    private String message;

    public LoginException(String message) {
        super(message);
    }

    public LoginException(String message, Throwable cause) {
        super(message, cause);
    }
}

3.6冻结登录实现

(1)自定义一个DAO类,LoginLogSpecDAO

package com.example.shop.dao;

import com.example.shop.model.LoginLog;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface LoginLogSpecDAO {
    int countByUsername(LoginLog loginLog);

}

(2)model类LoginLog自动生成Mybatis

package com.example.shop.model;

import java.util.Date;

public class LoginLog {
    private Integer id;

    private String username;

    private String ip;

    private Integer loginSuccess;

    private Date loginTime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public Integer getLoginSuccess() {
        return loginSuccess;
    }

    public void setLoginSuccess(Integer loginSuccess) {
        this.loginSuccess = loginSuccess;
    }

    public Date getLoginTime() {
        return loginTime;
    }

    public void setLoginTime(Date loginTime) {
        this.loginTime = loginTime;
    }
}
<table tableName="login_log" domainObjectName="LoginLog" mapperName="LoginLogDAO" catalog="shop">
            <property name="ignoreQualifiersAtRuntime" value="true"/>
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>

(3)编写LoginLogSpecDAO.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.shop.dao.LoginLogSpecDAO">
    <!-- 根据用户id查询角色名称 -->
    <select id="countByUsername" parameterType="com.example.shop.model.LoginLog" resultType="java.lang.Integer">
        select count(id)
        from login_log
        where username = #{username}
        and login_time > DATE_SUB(NOW(),INTERVAL 5 MINUTE)
        and login_success = 0
    </select>

</mapper>

(4)重写实现类

package com.example.shop.service.impl;

import com.example.shop.dao.LoginLogDAO;
import com.example.shop.dao.LoginLogSpecDAO;
import com.example.shop.dao.UserDAO;
import com.example.shop.model.LoginLog;
import com.example.shop.model.LoginLogExample;
import com.example.shop.model.User;
import com.example.shop.model.UserExample;
import com.example.shop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDAO userDAO;

    @Autowired
    private LoginLogDAO loginLogDAO;

    @Autowired
    private LoginLogSpecDAO loginLogSpecDAO;

    /**
     * 检查登录失败次数
     */
    @Override
    public Integer checkLoginLog(User user){
        //判断该账号是否可以登录
        LoginLog loginLog = new LoginLog();
        loginLog.setUsername(user.getUsername());
        return loginLogSpecDAO.countByUsername(loginLog);
    }


    /**
     * 登录验证用户名和密码
     * @param user
     * @return
     */
    @Override
    public User login(User user, String ip) {
        //判断用户名密码是否存在
        UserExample userExample = new UserExample();
        userExample.createCriteria().andUsernameEqualTo(user.getUsername()).andPasswordEqualTo(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
        List<User> users = userDAO.selectByExample(userExample);

        //增加登录日志
        int flag = !CollectionUtils.isEmpty(users) ? 1 : 0;
        LoginLog loginLog = new LoginLog();
        loginLog.setUsername(user.getUsername());
        loginLog.setIp(ip);
        loginLog.setLoginTime(new Date());
        loginLog.setLoginSuccess(flag);
        loginLogDAO.insertSelective(loginLog);

        return !CollectionUtils.isEmpty(users) ? users.get(0) : null;
    }

    /**
     * 新用户注册
     * @param user
     * @return
     */
    @Override
    public Integer reg(User user){
        //判断手机号和用户名是否重复
        UserExample ue = new UserExample();
        ue.createCriteria().andUsernameEqualTo(user.getUsername());
        ue.or().andPhoneEqualTo(user.getPhone());
        List<User> users = userDAO.selectByExample(ue);
        if(!CollectionUtils.isEmpty(users)){
            return -1;
        }

        //密码加密,增加创建时间,注册用户信息
        user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
        user.setCreatedTime(new Date());
        int rs = userDAO.insertSelective(user);

        //如果添加成功,获取刚插入的id
        if(rs > 0){
            return user.getId();
        }
        return rs;
    }
}

3.7postman测试

3.8工具类

IpUtils

package com.example.shop.common.util;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IpUtils {
    public static String getIpAddr(HttpServletRequest request) {
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (ipAddress.equals("127.0.0.1")) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                // = 15
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress="";
        }
        // ipAddress = this.getRequest().getRemoteAddr();

        return ipAddress;
    }
}

JwtUtils  

package com.example.shop.common.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * @author dhl
 * @datetime 2021/8/17  13:47
 */
public class JwtUtils {
    /**
     * 超时时间
     */
    private static final long TIME_OUT_MS = 1000 * 60 * 60 * 24;
    /**
     * 加密方式
     */
    private static final String ENCRYPT ="wqw123";
    /**
     * 算法
     */
    private static final Algorithm ALGORITHM = Algorithm.HMAC256(ENCRYPT);

    /**
     * 生成签名,30min后过期
     * @param id
     * @return
     */
    public static String createToken(Integer id, String username){
        Date date = new Date(System.currentTimeMillis() + TIME_OUT_MS);
        return JWT.create()
                // 设置荷载 payload
                .withClaim("id", id)
                .withClaim("username", username)
                // 设置过期时间
                .withExpiresAt(date)
                .sign(ALGORITHM);
    }

    /**
     * 验证token是否正确
     * @param token
     * @return
     */
    public static boolean verify(String token) {
        try {
            JWTVerifier verifier = JWT.require(ALGORITHM).build();
            verifier.verify(token);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 获取token中的信息
     * @param token
     * @param name
     * @return
     */
    public static String getClaimByName(String token, String name) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim(name).asString();
    }
}

ResultModel 

package com.example.shop.common.util;

import lombok.Data;

@Data
public class ResultModel<T> {
    private int code;
    private String message="";
    private T content;
    public ResultModel(){
    }
    public ResultModel(int code,String message){
        this.code = code;
        this.message = message;
    }
    public ResultModel(int code,String message,T content){
        this.code = code;
        this.message = message;
        this.content = content;
    }
    public static <T> ResultModel<T> success(String message,T content){
        return new ResultModel<T>(0,message,content);
    }
    public static <T> ResultModel<T> success(T content){
        return new ResultModel<T>(0,"success",content);
    }
    public static <T> ResultModel<T> error(int code,String message){
        return new ResultModel<T>(code,message);
    }
    public static <T> ResultModel<T> error(String message){
        return new ResultModel<T>(-1,message);
    }
    public static <T> ResultModel<T> error(){
        return new ResultModel<T>(-1,"error");
    }
}

 

springboot连接达梦数据库 spring: application: name: day0704 datasource: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://localhost:5236/ROOT?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 username: ROOT password: 20050528Hyn D:\develop\Java21\jdk-21\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\JAVA\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=59885:D:\JAVA\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\2024javaweb\代码\2024javaweb\day0704\target\classes;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\3.3.13\spring-boot-starter-jdbc-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter\3.3.13\spring-boot-starter-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot\3.3.13\spring-boot-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.3.13\spring-boot-autoconfigure-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.3.13\spring-boot-starter-logging-3.3.13.jar;C:\Users\H\.m2\repository\ch\qos\logback\logback-classic\1.5.18\logback-classic-1.5.18.jar;C:\Users\H\.m2\repository\ch\qos\logback\logback-core\1.5.18\logback-core-1.5.18.jar;C:\Users\H\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.23.1\log4j-to-slf4j-2.23.1.jar;C:\Users\H\.m2\repository\org\apache\logging\log4j\log4j-api\2.23.1\log4j-api-2.23.1.jar;C:\Users\H\.m2\repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;C:\Users\H\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\H\.m2\repository\org\yaml\snakeyaml\2.2\snakeyaml-2.2.jar;C:\Users\H\.m2\repository\com\zaxxer\HikariCP\5.1.0\HikariCP-5.1.0.jar;C:\Users\H\.m2\repository\org\springframework\spring-jdbc\6.1.21\spring-jdbc-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\spring-beans\6.1.21\spring-beans-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\spring-tx\6.1.21\spring-tx-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\3.3.13\spring-boot-starter-data-jpa-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.3.13\spring-boot-starter-aop-3.3.13.jar;C:\Users\H\.m2\repository\org\aspectj\aspectjweaver\1.9.24\aspectjweaver-1.9.24.jar;C:\Users\H\.m2\repository\org\hibernate\orm\hibernate-core\6.5.3.Final\hibernate-core-6.5.3.Final.jar;C:\Users\H\.m2\repository\jakarta\persistence\jakarta.persistence-api\3.1.0\jakarta.persistence-api-3.1.0.jar;C:\Users\H\.m2\repository\jakarta\transaction\jakarta.transaction-api\2.0.1\jakarta.transaction-api-2.0.1.jar;C:\Users\H\.m2\repository\org\jboss\logging\jboss-logging\3.5.3.Final\jboss-logging-3.5.3.Final.jar;C:\Users\H\.m2\repository\org\hibernate\common\hibernate-commons-annotations\6.0.6.Final\hibernate-commons-annotations-6.0.6.Final.jar;C:\Users\H\.m2\repository\io\smallrye\jandex\3.1.2\jandex-3.1.2.jar;C:\Users\H\.m2\repository\com\fasterxml\classmate\1.7.0\classmate-1.7.0.jar;C:\Users\H\.m2\repository\net\bytebuddy\byte-buddy\1.14.19\byte-buddy-1.14.19.jar;C:\Users\H\.m2\repository\jakarta\inject\jakarta.inject-api\2.0.1\jakarta.inject-api-2.0.1.jar;C:\Users\H\.m2\repository\org\antlr\antlr4-runtime\4.13.0\antlr4-runtime-4.13.0.jar;C:\Users\H\.m2\repository\org\springframework\data\spring-data-jpa\3.3.13\spring-data-jpa-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\data\spring-data-commons\3.3.13\spring-data-commons-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\spring-orm\6.1.21\spring-orm-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\spring-aspects\6.1.21\spring-aspects-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-data-ldap\3.3.13\spring-boot-starter-data-ldap-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\data\spring-data-ldap\3.3.13\spring-data-ldap-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\ldap\spring-ldap-core\3.2.13\spring-ldap-core-3.2.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-security\3.3.13\spring-boot-starter-security-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\spring-aop\6.1.21\spring-aop-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\security\spring-security-config\6.3.10\spring-security-config-6.3.10.jar;C:\Users\H\.m2\repository\org\springframework\security\spring-security-web\6.3.10\spring-security-web-6.3.10.jar;C:\Users\H\.m2\repository\org\springframework\spring-expression\6.1.21\spring-expression-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-thymeleaf\3.3.13\spring-boot-starter-thymeleaf-3.3.13.jar;C:\Users\H\.m2\repository\org\thymeleaf\thymeleaf-spring6\3.1.3.RELEASE\thymeleaf-spring6-3.1.3.RELEASE.jar;C:\Users\H\.m2\repository\org\thymeleaf\thymeleaf\3.1.3.RELEASE\thymeleaf-3.1.3.RELEASE.jar;C:\Users\H\.m2\repository\org\attoparser\attoparser\2.0.7.RELEASE\attoparser-2.0.7.RELEASE.jar;C:\Users\H\.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.3.13\spring-boot-starter-web-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.3.13\spring-boot-starter-json-3.3.13.jar;C:\Users\H\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.17.3\jackson-datatype-jdk8-2.17.3.jar;C:\Users\H\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.17.3\jackson-datatype-jsr310-2.17.3.jar;C:\Users\H\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.17.3\jackson-module-parameter-names-2.17.3.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.3.13\spring-boot-starter-tomcat-3.3.13.jar;C:\Users\H\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.42\tomcat-embed-core-10.1.42.jar;C:\Users\H\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.42\tomcat-embed-websocket-10.1.42.jar;C:\Users\H\.m2\repository\org\springframework\spring-web\6.1.21\spring-web-6.1.21.jar;C:\Users\H\.m2\repository\io\micrometer\micrometer-observation\1.13.15\micrometer-observation-1.13.15.jar;C:\Users\H\.m2\repository\io\micrometer\micrometer-commons\1.13.15\micrometer-commons-1.13.15.jar;C:\Users\H\.m2\repository\org\springframework\spring-webmvc\6.1.21\spring-webmvc-6.1.21.jar;C:\Users\H\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\3.0.4\mybatis-spring-boot-starter-3.0.4.jar;C:\Users\H\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\3.0.4\mybatis-spring-boot-autoconfigure-3.0.4.jar;C:\Users\H\.m2\repository\org\mybatis\mybatis\3.5.17\mybatis-3.5.17.jar;C:\Users\H\.m2\repository\org\mybatis\mybatis-spring\3.0.4\mybatis-spring-3.0.4.jar;C:\Users\H\.m2\repository\org\springframework\session\spring-session-jdbc\3.3.7\spring-session-jdbc-3.3.7.jar;C:\Users\H\.m2\repository\org\springframework\session\spring-session-core\3.3.7\spring-session-core-3.3.7.jar;C:\Users\H\.m2\repository\org\springframework\spring-jcl\6.1.21\spring-jcl-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\spring-context\6.1.21\spring-context-6.1.21.jar;C:\Users\H\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-springsecurity6\3.1.3.RELEASE\thymeleaf-extras-springsecurity6-3.1.3.RELEASE.jar;C:\Users\H\.m2\repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;C:\Users\H\.m2\repository\com\mysql\mysql-connector-j\8.3.0\mysql-connector-j-8.3.0.jar;C:\Users\H\.m2\repository\org\projectlombok\lombok\1.18.38\lombok-1.18.38.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-test\3.3.13\spring-boot-starter-test-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-test\3.3.13\spring-boot-test-3.3.13.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\3.3.13\spring-boot-test-autoconfigure-3.3.13.jar;C:\Users\H\.m2\repository\com\jayway\jsonpath\json-path\2.9.0\json-path-2.9.0.jar;C:\Users\H\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.2\jakarta.xml.bind-api-4.0.2.jar;C:\Users\H\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.3\jakarta.activation-api-2.1.3.jar;C:\Users\H\.m2\repository\net\minidev\json-smart\2.5.2\json-smart-2.5.2.jar;C:\Users\H\.m2\repository\net\minidev\accessors-smart\2.5.2\accessors-smart-2.5.2.jar;C:\Users\H\.m2\repository\org\ow2\asm\asm\9.7.1\asm-9.7.1.jar;C:\Users\H\.m2\repository\org\assertj\assertj-core\3.25.3\assertj-core-3.25.3.jar;C:\Users\H\.m2\repository\org\awaitility\awaitility\4.2.2\awaitility-4.2.2.jar;C:\Users\H\.m2\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;C:\Users\H\.m2\repository\org\junit\jupiter\junit-jupiter\5.10.5\junit-jupiter-5.10.5.jar;C:\Users\H\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.10.5\junit-jupiter-api-5.10.5.jar;C:\Users\H\.m2\repository\org\opentest4j\opentest4j\1.3.0\opentest4j-1.3.0.jar;C:\Users\H\.m2\repository\org\junit\platform\junit-platform-commons\1.10.5\junit-platform-commons-1.10.5.jar;C:\Users\H\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\H\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.10.5\junit-jupiter-params-5.10.5.jar;C:\Users\H\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.10.5\junit-jupiter-engine-5.10.5.jar;C:\Users\H\.m2\repository\org\junit\platform\junit-platform-engine\1.10.5\junit-platform-engine-1.10.5.jar;C:\Users\H\.m2\repository\org\mockito\mockito-core\5.11.0\mockito-core-5.11.0.jar;C:\Users\H\.m2\repository\net\bytebuddy\byte-buddy-agent\1.14.19\byte-buddy-agent-1.14.19.jar;C:\Users\H\.m2\repository\org\objenesis\objenesis\3.3\objenesis-3.3.jar;C:\Users\H\.m2\repository\org\mockito\mockito-junit-jupiter\5.11.0\mockito-junit-jupiter-5.11.0.jar;C:\Users\H\.m2\repository\org\skyscreamer\jsonassert\1.5.3\jsonassert-1.5.3.jar;C:\Users\H\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\H\.m2\repository\org\springframework\spring-core\6.1.21\spring-core-6.1.21.jar;C:\Users\H\.m2\repository\org\springframework\spring-test\6.1.21\spring-test-6.1.21.jar;C:\Users\H\.m2\repository\org\xmlunit\xmlunit-core\2.9.1\xmlunit-core-2.9.1.jar;C:\Users\H\.m2\repository\org\springframework\security\spring-security-core\6.3.10\spring-security-core-6.3.10.jar;C:\Users\H\.m2\repository\org\springframework\security\spring-security-crypto\6.3.10\spring-security-crypto-6.3.10.jar;C:\Users\H\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.3.13\spring-boot-starter-validation-3.3.13.jar;C:\Users\H\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.42\tomcat-embed-el-10.1.42.jar;C:\Users\H\.m2\repository\org\hibernate\validator\hibernate-validator\8.0.2.Final\hibernate-validator-8.0.2.Final.jar;C:\Users\H\.m2\repository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;C:\Users\H\.m2\repository\com\auth0\java-jwt\4.4.0\java-jwt-4.4.0.jar;C:\Users\H\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.17.3\jackson-databind-2.17.3.jar;C:\Users\H\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.17.3\jackson-annotations-2.17.3.jar;C:\Users\H\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.17.3\jackson-core-2.17.3.jar;C:\Users\H\.m2\repository\com\github\pagehelper\pagehelper-spring-boot-starter\1.4.6\pagehelper-spring-boot-starter-1.4.6.jar;C:\Users\H\.m2\repository\com\github\pagehelper\pagehelper-spring-boot-autoconfigure\1.4.6\pagehelper-spring-boot-autoconfigure-1.4.6.jar;C:\Users\H\.m2\repository\com\github\pagehelper\pagehelper\5.3.2\pagehelper-5.3.2.jar;C:\Users\H\.m2\repository\com\github\jsqlparser\jsqlparser\4.5\jsqlparser-4.5.jar;C:\Users\H\.m2\repository\com\aliyun\oss\aliyun-sdk-oss\3.17.4\aliyun-sdk-oss-3.17.4.jar;C:\Users\H\.m2\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;C:\Users\H\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\H\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\H\.m2\repository\commons-codec\commons-codec\1.16.1\commons-codec-1.16.1.jar;C:\Users\H\.m2\repository\org\jdom\jdom2\2.0.6.1\jdom2-2.0.6.1.jar;C:\Users\H\.m2\repository\org\codehaus\jettison\jettison\1.5.4\jettison-1.5.4.jar;C:\Users\H\.m2\repository\com\aliyun\aliyun-java-sdk-core\4.5.10\aliyun-java-sdk-core-4.5.10.jar;C:\Users\H\.m2\repository\com\google\code\gson\gson\2.10.1\gson-2.10.1.jar;C:\Users\H\.m2\repository\org\jacoco\org.jacoco.agent\0.8.5\org.jacoco.agent-0.8.5-runtime.jar;C:\Users\H\.m2\repository\org\ini4j\ini4j\0.5.4\ini4j-0.5.4.jar;C:\Users\H\.m2\repository\io\opentracing\opentracing-api\0.33.0\opentracing-api-0.33.0.jar;C:\Users\H\.m2\repository\io\opentracing\opentracing-util\0.33.0\opentracing-util-0.33.0.jar;C:\Users\H\.m2\repository\io\opentracing\opentracing-noop\0.33.0\opentracing-noop-0.33.0.jar;C:\Users\H\.m2\repository\com\aliyun\aliyun-java-sdk-ram\3.1.0\aliyun-java-sdk-ram-3.1.0.jar;C:\Users\H\.m2\repository\com\aliyun\aliyun-java-sdk-kms\2.11.0\aliyun-java-sdk-kms-2.11.0.jar;C:\Users\H\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\H\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\H\.m2\repository\javax\activation\activation\1.1.1\activation-1.1.1.jar;C:\Users\H\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.3\jaxb-runtime-2.3.3.jar;C:\Users\H\.m2\repository\org\glassfish\jaxb\txw2\4.0.5\txw2-4.0.5.jar;C:\Users\H\.m2\repository\com\sun\istack\istack-commons-runtime\4.1.2\istack-commons-runtime-4.1.2.jar;C:\Users\H\.m2\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;C:\Users\H\.m2\repository\com\dm\DmJdbcDriver\1.8.0\DmJdbcDriver-1.8.0.jar com.example.day0704.Day0704Application . ____ _ __ _ _ /\\ / ___&#39;_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | &#39;_ | &#39;_| | &#39;_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) &#39; |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.3.13) 2025-07-04T11:38:43.764+08:00 INFO 26280 --- [day0704] [ main] com.example.day0704.Day0704Application : Starting Day0704Application using Java 21.0.3 with PID 26280 (D:\2024javaweb\代码\2024javaweb\day0704\target\classes started by H in D:\2024javaweb\代码\2024javaweb\day0704) 2025-07-04T11:38:43.765+08:00 INFO 26280 --- [day0704] [ main] com.example.day0704.Day0704Application : No active profile set, falling back to 1 default profile: "default" 2025-07-04T11:38:44.114+08:00 INFO 26280 --- [day0704] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2025-07-04T11:38:44.114+08:00 INFO 26280 --- [day0704] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2025-07-04T11:38:44.125+08:00 INFO 26280 --- [day0704] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7 ms. Found 0 JPA repository interfaces. 2025-07-04T11:38:44.131+08:00 INFO 26280 --- [day0704] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2025-07-04T11:38:44.131+08:00 INFO 26280 --- [day0704] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data LDAP repositories in DEFAULT mode. 2025-07-04T11:38:44.134+08:00 INFO 26280 --- [day0704] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 LDAP repository interfaces. 2025-07-04T11:38:44.441+08:00 INFO 26280 --- [day0704] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2025-07-04T11:38:44.448+08:00 INFO 26280 --- [day0704] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-07-04T11:38:44.448+08:00 INFO 26280 --- [day0704] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.42] 2025-07-04T11:38:44.506+08:00 INFO 26280 --- [day0704] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-07-04T11:38:44.506+08:00 INFO 26280 --- [day0704] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 720 ms 2025-07-04T11:38:44.556+08:00 INFO 26280 --- [day0704] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2025-07-04T11:38:44.602+08:00 INFO 26280 --- [day0704] [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection dm.jdbc.driver.DmdbConnection@6b162ecc 2025-07-04T11:38:44.603+08:00 INFO 26280 --- [day0704] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2025-07-04T11:38:44.611+08:00 WARN 26280 --- [day0704] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;entityManagerFactory&#39; defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Failed to initialize dependency &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; of LoadTimeWeaverAware bean &#39;entityManagerFactory&#39;: Error creating bean with name &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; defined in class path resource [org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.class]: Failed to instantiate [org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer]: Factory method &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; threw exception with message: Unable to detect database type 2025-07-04T11:38:44.611+08:00 INFO 26280 --- [day0704] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2025-07-04T11:38:44.612+08:00 INFO 26280 --- [day0704] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2025-07-04T11:38:44.613+08:00 INFO 26280 --- [day0704] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2025-07-04T11:38:44.618+08:00 INFO 26280 --- [day0704] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with &#39;debug&#39; enabled. 2025-07-04T11:38:44.626+08:00 ERROR 26280 --- [day0704] [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;entityManagerFactory&#39; defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Failed to initialize dependency &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; of LoadTimeWeaverAware bean &#39;entityManagerFactory&#39;: Error creating bean with name &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; defined in class path resource [org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.class]: Failed to instantiate [org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer]: Factory method &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; threw exception with message: Unable to detect database type at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:326) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.21.jar:6.1.21] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.21.jar:6.1.21] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.13.jar:3.3.13] at com.example.day0704.Day0704Application.main(Day0704Application.java:10) ~[classes/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; defined in class path resource [org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.class]: Failed to instantiate [org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer]: Factory method &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; threw exception with message: Unable to detect database type at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:648) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1355) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1185) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:313) ~[spring-beans-6.1.21.jar:6.1.21] ... 10 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer]: Factory method &#39;jdbcSessionDataSourceScriptDatabaseInitializer&#39; threw exception with message: Unable to detect database type at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:178) ~[spring-beans-6.1.21.jar:6.1.21] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644) ~[spring-beans-6.1.21.jar:6.1.21] ... 20 common frames omitted Caused by: java.lang.IllegalStateException: Unable to detect database type at org.springframework.util.Assert.state(Assert.java:76) ~[spring-core-6.1.21.jar:6.1.21] at org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver.determinePlatform(PlatformPlaceholderDatabaseDriverResolver.java:133) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver.lambda$resolveAll$0(PlatformPlaceholderDatabaseDriverResolver.java:97) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver.resolveAll(PlatformPlaceholderDatabaseDriverResolver.java:122) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver.resolveAll(PlatformPlaceholderDatabaseDriverResolver.java:97) ~[spring-boot-3.3.13.jar:3.3.13] at org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer.resolveSchemaLocations(JdbcSessionDataSourceScriptDatabaseInitializer.java:86) ~[spring-boot-autoconfigure-3.3.13.jar:3.3.13] at org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer.getSettings(JdbcSessionDataSourceScriptDatabaseInitializer.java:74) ~[spring-boot-autoconfigure-3.3.13.jar:3.3.13] at org.springframework.boot.autoconfigure.session.JdbcSessionDataSourceScriptDatabaseInitializer.<init>(JdbcSessionDataSourceScriptDatabaseInitializer.java:48) ~[spring-boot-autoconfigure-3.3.13.jar:3.3.13] at org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration.jdbcSessionDataSourceScriptDatabaseInitializer(JdbcSessionConfiguration.java:65) ~[spring-boot-autoconfigure-3.3.13.jar:3.3.13] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:146) ~[spring-beans-6.1.21.jar:6.1.21] ... 21 common frames omitted 进程已结束,退出代码为 1 如何解决以上问题
最新发布
07-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amo@骄纵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值