目录
1.3.1 在实体类的属性上添加@TableField注解,指定自动填充的策略
1.3.2 编写元数据对象处理器,此类需要实现metaObjectHandler接口
1.8 @ServletComponentScan和@ComponentScan
一、Common
1.1 返回结果封装类
@Data
public class R<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
1.2 全局异常处理
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
log.error(ex.getMessage());
if(ex.getMessage().contains("Duplicate entry")){
String[] split = ex.getMessage().split(" ");
String msg = split[2] + "已存在";
return R.error(msg);
}
return R.error("未知错误");
}
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(CustomException.class)
public R<String> exceptionHandler(CustomException ex){
log.error(ex.getMessage());
return R.error(ex.getMessage());
}
}
ExceptionHandler, 方法注解, 作用于 Controller 级别. ExceptionHandler 注解为一个 Controler 定义一个异常处理器.
ControllerAdvice, 类注解, 作用于 整个 Spring 工程. ControllerAdvice 注解定义了一个全局的异常处理器.
@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常
使用@ExceptionHandler时尽量不要使用相同的注解参数。当两个方法都处理相同异常时,这种定义方式编译可以通过,而当该异常真正被抛出时,Spring会给我们报错
1.3 自定义元数据对象处理器
1.3.1 在实体类的属性上添加@TableField注解,指定自动填充的策略
1.3.2 编写元数据对象处理器,此类需要实现metaObjectHandler接口
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
*/
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* 设置值
* @param id
*/
public static void setCurrentId(Long id){
threadLocal.set(id);
}
/**
* 获取值
* @return
*/
public static Long getCurrentId(){
return threadLocal.get();
}
}
/**
* 自定义元数据对象处理器
*/
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作,自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",BaseContext.getCurrentId());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
/**
* 更新操作,自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]...");
log.info(metaObject.toString());
long id = Thread.currentThread().getId();
log.info("线程id为:{}",id);
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
}
MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。
主要用于指定创建人及创建时间等参数
1.4 静态资源映射器
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
这段代码的作用是将以 "/backend" 开头的请求映射到类路径(classpath)下的 "/backend" 目录下的资源。也就是说,当接收到以 "/backend" 开头的请求时,会尝试从类路径下的 "/backend" 目录下查找对应的文件并返回给客户端。这通常用于将静态资源文件,比如页面模板、图片等,打包到 jar 包中,然后在运行时通过这种方式提供给客户端使用。
spring boot的静态资源:
static目录:css、js、图片等
templates目录:html页面
优先级spring boot默认将/**静态资源访问映射到以下目录:
classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources这四个目录的访问优先级:META-INF/resources > resources > static > public
即:这四个路径下如果有同名文件,则会以优先级高的文件为准。
因此对于其余目录内的静态需要配置映射器
1.5 扩展mvc框架的消息转换器
这段代码是对 Spring MVC 消息转换器进行扩展的代码。消息转换器是将请求和响应中的内容与对象之间进行转换的核心技术。它主要的作用就是将请求数据或响应数据与 Java 对象之间的转换。在这段代码中,我们通过重写
extendMessageConverters
方法,向 Spring MVC 框架中追加一个自定义的 JSON 消息转换器。
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
/**
* 扩展mvc框架的消息转换器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("扩展消息转换器...");
//创建消息转换器对象
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
//设置对象转换器,底层使用Jackson将Java对象转为json
messageConverter.setObjectMapper(new JacksonObjectMapper());
//将上面的消息转换器对象追加到mvc框架的转换器集合中
converters.add(0,messageConverter);
}
}
1.6 logback.xml
logback.xml是logback日志框架的配置文件,用于配置应用程序的日志输出方式、日志级别、日志格式等信息。通过logback.xml,可以提供灵活的日志记录方式,方便开发者对日志进行管理和分析。
具体而言,logback.xml的作用如下:
- 配置日志输出的目的地:可以指定输出日志的文件路径、输出到控制台还是其他应用程序。
- 配置日志的级别:指定日志的级别,如DEBUG、INFO、WARN、ERROR等,可以根据不同级别来控制日志的输出量。
- 配置日志的格式:可以自定义日志的输出格式,如时间戳、线程名、日志级别、类名等。
- 进行日志的归档和滚动:可以配置日志文件的大小限制,超过限制后自动创建新的日志文件,防止单个日志文件过大。
- 配置日志的异步输出:可以将日志输出的过程异步化,提高应用程序的性能。
- 设置日志的分级:可以将不同类别的日志分别输出到不同的文件或目的地。
- 配置日志的筛选:可以根据不同的条件对日志进行筛选,只输出符合条件的日志。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址,使用绝对路径-->
<property name="LOG_HOME" value="e:/logs"/>