苍穹外卖-DAY03

1.公共字段自动填充

apo切面编程实现

  • 获取操作类型
  • 获取目标对象
  • 进行反射自动填充

注解的value

  • 方法即属性:在注解中,定义的“无参方法”其实是配置项(属性)。OperationType value(); 的意思是:“请在使用我时,填入一个 OperationType 类型的对象”。
  • value 的特权:这是 Java 的语法糖
    • 因为名字叫 value,且没有其他属性需要赋值,所以你可以简写。
    • 简写@AutoFill(OperationType.INSERT)
    • 全写@AutoFill(value = OperationType.INSERT)
  • 类型安全:返回值类型规定为 OperationType,是为了防止你乱填(比如填个字符串),编译器会强制检查。

2.新增菜品

文件上传功能实现

D:\小川\code\项目\sky-take-out\sky-server\src\main\resources\application.yml文件配置

D:\小川\code\项目\sky-take-out\sky-server\src\main\resources\application-dev.yml文件具体配置属性

D:\小川\code\项目\sky-take-out\sky-common\src\main\java\com\sky\properties\AliOssProperties.java制作属性类自动导入

D:\小川\code\项目\sky-take-out\sky-server\src\main\java\com\sky\config\OssConfiguration.java制作配置类实现自动注入

image-20260202125532768

D:\小川\code\项目\sky-take-out\sky-server\src\main\java\com\sky\controller\admin\CommonController.javaController层代码使用自动注入,导入工具类

image-20260202125700071

事务锁处理

启动类上注解@EnableTransactionManagement

image-20260202131516088

之后再多次处理数据库表时添加锁事务管理

image-20260202131736697

数据库插入后返回主键值

在执行插入语句标签加入下面代码

1
<insert id="insert" useGeneratedKeys="true" keyProperty="id">

即可将插入类的id属性赋值为返回主键

之后通过类getId获取

3.修改菜品

这一块我手欠安装了一个Actuator,这个监控程序与我项目的springboot版本不同,会导致特别大的问题,一堆报错,真是绷不住了

解决方式如下

创建一个Knife4jConfig.java这样的配置类,可以“拦截”下 Swagger 的扫描器,强行把那些使用 PathPatternParser 的映射(也就是 Actuator 搞出来的那些会导致报错的映射)从 Swagger 的扫描列表中剔除掉

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
package com.sky.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;

import java.lang.reflect.Field;
import java.util.List;
import java.util.stream.Collectors;

/**
* 解决 Springfox 3.0.0 与 Spring Boot 2.6+ 的兼容性问题
*/
@Configuration
public class Knife4jConfig {

@Bean
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
return new BeanPostProcessor() {

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
}
return bean;
}

private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
List<T> copy = mappings.stream()
.filter(mapping -> mapping.getPatternParser() == null)
.collect(Collectors.toList());
mappings.clear();
mappings.addAll(copy);
}

@SuppressWarnings("unchecked")
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
try {
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
field.setAccessible(true);
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
};
}
}