电商项目开发(持续更新中.....)

电商项目实战



前言

项目开发流程
需求——原型图,需求文档
Kick Off——产品,开发,测试,运维,运营,市场
程序员——开发,设计,编码,测试员——测试,TC编写,测试,发布

一、准备工作

1.新建项目
新建maven项目,修改父项目配置文件pom.xml,添加标签packing,属性值为pom,添加父项目spring boot配置

<!--spring boot-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    .......
    <packaging>pom</packaging>

2.创建用户表
id,用户名,密码,头像,邮箱,昵称,备注信息,创建时间(gmt_create),更新时间(gmt_modified),最后登录时间,账号启用状态(0禁用,1启用)
在这里插入图片描述
3.代码生成器配置
1]修改pom.xml文件,配置mysql,Lombok,MyBatis和模板引擎,安装Lombok插件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 代码生成器-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
        <!--模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
    </dependencies>

2]引入jar包 参考代码仓库中的xml https://gitee.com/cpf100/msb-dongbao-mall
3]在application.yml配置文件中添加数据库连接

# mysql
spring:
  datasource:
    #MySQL配置
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xxx(数据库名)?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: xxx(用户名)
    password: xxx(密码)
  profiles:
    active: dev

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0
  mapper-locations:
    - classpath*:/com/msb/dongbao/ums/mapper/xml/*.xml

4]AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率
创建generator类,执行该类,可以在指定目录下生成各个模块的代码,执行Pass
参考MyBatis官方网站 https://baomidou.com/pages/d357af/

public class CodeGenerator {

    public static void main(String[] args) {
        // 1创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2.全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("D:\\workspace\\idea\\msb-dongbao-mall-parent\\msb-dongbao-service\\msb-dongbao-ums\\src\\main\\java");
//        String projectPath = System.getProperty("user.dir");
//        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("xxx");
        gc.setOpen(false);  // 生成后是否打开资源管理器
        gc.setFileOverride(false);  // 重新生成时文件是否覆盖
        gc.setServiceName("%sService");  // 去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER_STR);  //  主键策略
        gc.setDateType(DateType.ONLY_DATE);  // 定义生成的实体类中日期类型
        gc.setSwagger2(false); // 实体属性 开启Swagger2 注解
        mpg.setGlobalConfig(gc);

        // 3.数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/xxxx(数据库名)?useUnicode=true&useSSL=false&characterEncoding=utf8");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("xxx");
        dsc.setPassword("xxx");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4.包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.msb.dongbao.ums");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);


        // 5.策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user_member");  //  表名
        strategy.setNaming(NamingStrategy.underline_to_camel); // 数据库表映射到实体的命名策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true); // url中驼峰连字符
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);

        // 6.执行
        mpg.execute();
    }
}

5]写测试类
在生成代码所在子项目的test目录下创建测试类,向表中添加数据,运行Pass

@SpringBootTest
public class UserMemberTest {

    @Autowired
    UserMemberMapper userMemberMapper;

    @Test
    void insertTest() {
        UserMember member = new UserMember();
        member.setUasename("葫芦娃");
        member.setPassword("11111");
        member.setNickName("小可爱");
        member.setEmail("111");
        userMemberMapper.insert(member);
    }
}

并在对应启动类前加注解@MapperScan
在这里插入图片描述
配置文件中添加对应的依赖

 <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-core</artifactId>
            <version>3.5.0</version>
            <scope>compile</scope>
        </dependency>
        
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.5.0</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.14</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
    </dependencies>

二、代码开发

用户信息

1.测试类
编写接口代码前,先测试controller和service功能能否跑通
1】测试controller类
代码器生成的service和实体类复制到api对应的子项目中,service子项目要依赖api子项目中的service和实体类,给service添加api的依赖,如下

<dependency>
   <groupId>org.example</groupId>
    <artifactId>msb-dongbao-ums-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

代码器生成的controller复制到web子项目,controller类内写个测试方法测试

@RestController
@RequestMapping("/user-member")
public class UserMemberController {
    @GetMapping("/test")
    public String test() {
        return "西安,加油!!!";
    }
}

项目运行成功后,浏览器访问http://localhost:8080/user-member/test,运行Pass
2】测试service类
service定义方法A,serviceImpl实现方法A,controller调用方法A,实现简单注册功能,验证能否跑通
1]service类

public String register();

2]serviceImpl类

@Autowired
    private UserMemberMapper userMemberMapper;

    public String register() {
        UserMember member = new UserMember();
        member.setUasename("鲁班七号");
        userMemberMapper.insert(member);
        return "register";
    }

3]controller类

@RestController
@RequestMapping("/user-member")
public class UserMemberController {
    @Autowired
    UserMemberService userMemberService;
    
    @GetMapping("/register")
    public String register() {
        userMemberService.register();
        return "register controller";
    }
}

项目运行成功后,浏览器访问http://localhost:8080/user-member/register,测试Pass
2.实现注册功能
1】接收前端请求参数,api子项目内创建dto类

@Data
@ToString
public class UserMemberRegisterDto {

    private String username;
    private String password;
    private String icon;
    private String email;
    private String nickName;
}

2】在Controller类register方法内写参数-注解@RequestBoby dto类对象,其他类中的register方法内引入参数

public String register(@RequestBody UserMemberRegisterDto userMemberRegisterDto){...}

3】在serviceImpl类register方法内写参数类内,将register方法内参数转换为数据库存储的参数,调用BeanUtils.copyProperties()方法,删除setxx()方法

UserMember member = new UserMember();
BeanUtils.copyProperties(userMemberRegisterDto, member);   //  此行
userMemberMapper.insert(member);

在postman中测试,输入地址和参数,Pass
在这里插入图片描述
延申:
1】mybatis封装时间
service子项目内创建类实现MetaObjectHandler,并重写两个方法,通过该类生成创建和更新时间(添加、更新数据时)

@Component
public class MyHanlder implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("添加创建时间");
        this.setFieldValByName("gmtCreate", new Date(), metaObject);
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("添加更新时间");
        this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}

在实体类的创建和更新时间方法中添加注解@TableField

/**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;

用户注册和更新数据时,会自动生成新建时间和更新时间
2】密码加密
密码不能明文存储 脱敏,脱掉敏感信息,密码,身份证…
加密方式,md5(彩虹表攻击),bcrypt
1]在serviceImpl类所在包下的启动类中添加如下代码

@Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

2]在serviceImpl类内给password加密,使用bcrypt

 UserMember member = new UserMember();
 BeanUtils.copyProperties(userMemberRegisterDto, member);

// 密码使用bcrypt加密
//        第一种
//        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//        String encoder = passwordEncoder.encode(userMemberRegisterDto.getPassword());
//        第二种
  String encoder = passwordEncoder.encode(userMemberRegisterDto.getPassword());  // 此行
  member.setPassword(encoder);  // 此行
  userMemberMapper.insert(member);

密码加密成功,在数据库内密文显示
3.登录模块
api子项目内创建dto类,依次编写xml,map类,service类,serviceImpl类和controller实现类,代码如下:
1】dto类

@Data
@ToString
public class UserMemberLoginDto {
    private String username;
    private String password;
}

2】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.msb.dongbao.ums.mapper.UserMemberMapper">
    <select id="selectByUsername" resultType="com.msb.api.ums.entity.UserMember">
        select * from user_member where username = #{username}
    </select>
</mapper>

3】map类

@Repository
public interface UserMemberMapper extends BaseMapper<UserMember> {

    UserMember selectByUsername(String username);
}

4】service类

public interface UserMemberService extends IService<UserMember> {
    String login(UserMemberLoginDto userMemberLoginDto);
}

5】serviceImpl类

public String login(UserMemberLoginDto userMemberLoginDto) {

        UserMember userMember = userMemberMapper.selectByUsername(userMemberLoginDto.getUsername());
        if (null != userMember) {
            String password = userMember.getPassword();
            if (!passwordEncoder.matches(userMemberLoginDto.getPassword(), password)) {
                return "密码不正确";
            }
        } else {
            return "用户名不存在";
        }
        return "token";
    }

6】controller实现类

@PostMapping("/login")
    public String login(@RequestBody UserMemberLoginDto userMemberLoginDto) {
        return userMemberService.login(userMemberLoginDto);
//        return "login success";
    }

在postman中测试,输入地址和参数,Pass
在这里插入图片描述
3.统一返回值,验证用户名,统一异常处理
1】统一返回值
1]在common子项目base内创建StateCodeEnum类,请求码

public enum StateCodeEnum {

    /**
     * 请求成功
     */
    SUCCESS(101, "请求成功"),

    /**
     * 请求失败
     */
    FAIL(301, "请求失败");


    private int code;
    private String msg;

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    StateCodeEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

2]再创建ResultWrapper类,返回值

@Data
@Builder
public class ResultWrapper<T> implements Serializable {
    // 状态码
    private int code;

    // 提示信息
    private String msg;

    private T data;

    // 返回成功的包装
    public static ResultWrapper.ResultWrapperBuilder getSuccessBuilder() {
        return ResultWrapper.builder().code(StateCodeEnum.SUCCESS.getCode()).msg(StateCodeEnum.SUCCESS.getMsg());
    }

    // 返回失败的包装
    public static ResultWrapper.ResultWrapperBuilder getFailBuilder() {
        return ResultWrapper.builder().code(StateCodeEnum.FAIL.getCode()).msg(StateCodeEnum.FAIL.getMsg());
    }
}

3]在controller实现类中修改各方法的返回类型与返回值

@PostMapping("/register")
    public ResultWrapper register(@RequestBody @Valid UserMemberRegisterDto userMemberRegisterDto) {
        userMemberService.register(userMemberRegisterDto);
        return ResultWrapper.getSuccessBuilder().data("111").build();
    }

在postman中测试,输入地址和参数,Pass
2】校验用户名不为空
在api子项目中pom.xml文件引入validation依赖,在dto对应的注册类中添加注解@NotEmpty(message=“用户名不为空”),在controller中register()方法中添加注解@Valid
校验时发生错误,400问题
在这里插入图片描述
在web子项目内创建ValidateHandler类,重写ResponseEntity()方法,拦截校验异常

@ControllerAdvice
public class ValidateHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        StringBuilder builder = new StringBuilder();
        for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
            String defaultMessage = fieldError.getDefaultMessage();
            builder.append(" " + defaultMessage);
            break;
        }
        return new ResponseEntity(ResultWrapper.builder().code(302).msg(builder.toString()).build(), HttpStatus.OK);
    }
}

在postman中测试,输入地址和参数,Pass,提示’用户名不为空’
在这里插入图片描述
3】异常处理,如拦截除数不能为0的异常,在web子项目内创建ExceptionHnadler 类

@RestControllerAdvice
public class ExceptionHnadler {
    @ExceptionHandler(ArithmeticException.class)
    public ResultWrapper customException() {
        return ResultWrapper.builder().code(302).msg("除数不能为0").build();
    }
}

在这里插入图片描述
4.token
前端访问后端,后端给前端返回token,第二次前端访问后端,携带token
1】在common的util子项目下创建JwtUtil类,生成token,解析token,pom.xml中引入jwt依赖

public class JwtUtil {

    private static final String secert = "abcdefg";

    public static String createToken(String subject) {
        String token = Jwts.builder().setSubject(subject)
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60))
                .signWith(SignatureAlgorithm.HS256, secert)
                .compact();
        return token;
    }

    public static String parseToken(String token) {
        Claims boby = Jwts.parser().setSigningKey(secert).parseClaimsJws(token).getBody();
        String subject = boby.getSubject();
        return subject;
    }

    public static void main(String[] args) throws InterruptedException {
        String name = "腾讯";
        String token = createToken(name);
        System.out.println("token is " + token);

        String str = parseToken(token);
        System.out.println("str is " + str);

//        TimeUnit.SECONDS.sleep(4);
//        str = parseToken(token);
//        System.out.println("str is " + str);
    }
}

2】在ServiceImpl类的login方法内生成token,在Controller实现类内写测试方法,测试token

//  生成token
String token = JwtUtil.createToken(userMember.getUsername());
return token;

// token测试方法
@GetMapping("/token-test")
    public String tokenTest(String token) {
        String parseStr = JwtUtil.parseToken(token);
        return parseStr;
    }

在postman中测试,输入地址和参数,Pass,登录时生成token,测试token时,解析token
在这里插入图片描述
在这里插入图片描述
延申:散列算法:md5,sha系列;对称加密;非对称加密
md5不可逆,但是有彩虹表,暴力破解
Base64是编码器,可以编码,也可以解码
5.ResultWrapper放置service层
1】修改register()方法,将此方法返回类型String改为ResultWrapper,ServiceImpl类

-	return "register";
+	return ResultWrapper.getSuccessBuilder().build();

Controller类register()方法

-	userMemberService.register(userMemberRegisterDto);
-	return ResultWrapper.getSuccessBuilder().data("111").build();
+	return userMemberService.register(userMemberRegisterDto);

2】修改login方法,将此方法返回类型String改为ResultWrapper,ServiceImpl类,当登录成功后,返回token和Usermember对象,密码为""

-	String token = JwtUtil.createToken(userMember.getUsername());
+	String token = JwtUtil.createToken(userMember.getId() + "");
+	UserMemberLoginRes userMemberLoginRes = new UserMemberLoginRes();
+	userMemberLoginRes.setToken(token);
+	userMember.setPassword("");
+	userMemberLoginRes.setUserMember(userMember);
+	return ResultWrapper.builder().data(userMemberLoginRes).build();
-	return token;

在api子项目内创建UserMemberLoginRes类

@Data
public class UserMemberLoginRes {
    private String token;
    private UserMember userMember;
}

在这里插入图片描述
6.修改用户信息,依次编写service,serviceImpl和controller实现类,完成修改用户信息功能
1】service类

ResultWrapper edit(UserMember userMember);

2】serviceImpl类

@Override
    public ResultWrapper edit(UserMember userMember) {
        userMemberMapper.updateById(userMember);
        return ResultWrapper.getSuccessBuilder().data(userMember).build();
    }

3】controller实现类

@PostMapping("/edit")
    public ResultWrapper edit(@RequestBody UserMember userMember) {
        return userMemberService.edit(userMember);
    }

3】在postman中测试,输入地址和参数(包括Handers中输入token),Pass,修改信息成功
在这里插入图片描述

项目中遇到错误

错误1
项目启动失败,最后一行报错,pom文件引用错误

Disconnected from the target VM, address: '127.0.0.1:51087', transport: 'socket'

解决方法

dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
</dependency>
修改为
<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

错误2
在SpringBoot的启动类上使用了@MapperScan(“xxx.xxx.xxx”)注解之后,启动的时候控制台出现如下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\workspace\idea\msb-dongbao-mall-parent\msb-dongbao-service\msb-dongbao-ums\target\classes\com\msb\dongbao\ums\MsbDongbaoUmsApplication.class]; nested exception is java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.mybatis.spring.annotation.MapperScan.factoryBean()

修改方法,pom.xml中添加配置

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.1</version>
</dependency>

错误3
启动项目时出错

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-01-12 10:34:19.407 ERROR 25280 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userMemberServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userMemberMapper' defined in file [D:\workspace\idea\msb-dongbao-mall-parent\msb-dongbao-service\msb-dongbao-ums\target\classes\com\msb\dongbao\ums\mapper\UserMemberMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
.........
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userMemberMapper' defined in file [D:\workspace\idea\msb-dongbao-mall-parent\msb-dongbao-service\msb-dongbao-ums\target\classes\com\msb\dongbao\ums\mapper\UserMemberMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
.............................
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
.........

解决方法:springboot启动类的@SpringBootApplication注解去掉
在这里插入图片描述
禁止 SpringBoot 自动注入数据源配置,DataSourceAutoConfiguration.class 会自动查找 application.yml 或者 properties 文件里的 spring.datasource.* 相关属性并自动配置单数据源「注意这里提到的单数据源」。如果项目中禁止自动注入数据源配置,又没有手动配置数据源(@ConfigurationProperties(prefix = “spring.datasource.hikari”)),启动就会报错,去掉这句就可以启动
错误4
启动项目时,端口被占用

Web server failed to start. Port 8080 was already in use.

方法1,杀掉端口对应进程

netstat -ano | findstr 端口号
taskkill -PID 进程号 -F

方法2
修改端口号,在application.yml配置文件中修改

server:
  port: 8014

错误5

Description:
A component required a bean of type 'com.msb.api.ums.service.UserMemberService' that could not be found.
Action:
Consider defining a bean of type 'com.msb.api.ums.service.UserMemberService' in your configuration.

解决方法,在启动类上添加如下注解,包名为service子项目下的包名

@SpringBootApplication(scanBasePackages = {"com.msb.dongbao.ums"})

错误6

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-01-12 16:35:23.444 ERROR 41976 --- [           main] o.s.boot.SpringApplication               : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userMemberServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.msb.dongbao.ums.mapper.UserMemberMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
......
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.msb.dongbao.ums.mapper.UserMemberMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
......

解决方法
配置文件application.yml中添加mybatis-plus配置,在启动类中添加如下注解

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0
  mapper-locations:
    - classpath*:/com/msb/dongbao/ums/mapper/xml/*.xml
@MapperScan("com.msb.dongbao.ums.mapper")

错误7

2022-01-13 21:48:16.534 ERROR 19740 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.NoClassDefFoundError: org/springframework/core/NativeDetector
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.<init>
.....

配置文件pom.xml文件中添加依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.14</version>
</dependency>

错误8

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Jan 13 22:05:23 CST 2022
There was an unexpected error (type=Not Found, status=404).

定位问题
点击右侧maven,选择子项目-Lifecycle,依次点击clean,package,出现如下错误

[ERROR] Failed to execute goal on project msb-dongbao-portal-web: Could not resolve dependencies for project org.example:msb-dongbao-portal-web:jar:1.0-SNAPSHOT: The following artifacts could not be resolved: org.example:msb-dongbao-ums-api:jar:1.0-SNAPSHOT, org.example:msb-dongbao-ums:jar:1.0-SNAPSHOT: Could not find artifact org.example:msb-dongbao-ums-api:jar:1.0-SNAPSHOT -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

启动类扫描不全面,修改如下:

@SpringBootApplication(scanBasePackages = {"com.msb.dongbao.ums"})
修改为
@SpringBootApplication(scanBasePackages = {"com.msb"})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值