java spring boot 注解、接口和问题解决方法(持续更新)

注解

@RestController

        是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染

@Controller

        是Spring Framework中的注解,用于标识一个类是控制器组件。在Spring MVC(Model-View-Controller)架构中扮演重要角色,负责处理来自客户端的HTTP请求,协调业务逻辑的处理,并根据请求返回适当的视图或数据

@ResponseBody

        是Spring MVC框架中的注解,用于将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到Response对象的Body区,通常用来返回JSON或XML数据。

        @ResponseBody注解的作用是将方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,例如AJAX。需要注意的是,如果使用了@RequestMapping注解,返回值通常会被解析为跳转路径,但加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。例如,异步获取json数据,加上@ResponseBody后,会直接返回json数据。

@RequestMapping

        是Spring框架中用于处理请求地址映射的注解,可用于类或方法上。当用于类上时,表示类中的所有响应请求的方法都是以该地址作为父路径;当用于方法上时,表示该方法处理请求的地址映射。

@RequestMapping

注解有六个属性,下面将其分成三类进行说明:

  • value:指定请求映射的URL路径。
  • method:指定请求的方法类型,如GET、POST等。
  • params:指定请求的参数,如查询参数等。
  • headers:指定请求中必须包含某些指定的header值,才能让该方法处理请求。
  • consumes:指定请求的内容类型,即消费的内容类型。
  • produces:指定响应的内容类型,即生产的内容类型。

@GetMapping和@PostMapping是Spring框架中用于处理不同HTTP请求方法的注解。

@GetMapping

        用于处理HTTP GET请求 是@RequestMapping(method = RequestMethod.GET)的缩写

@PostMapping

        用于处理HTTP POST请求。是@RequestMapping(method = RequestMethod.POST)的缩写

这两个注解的作用是将HTTP请求映射到特定的处理方法上,使得在后端代码中可以针对不同的请求进行相应的处理

@RequestParam

        如果是get请求 则使用 @RequestParam 注解直接接收参数

 @RequestBody

如果是post请求则使用 @RequestBody 注解 接收json参数

@SpringBootApplication

        是spring boot注解 标明当前是启动文件

@Mapper

        是MyBatis框架的注解,用于标识接口,这个接口定义了数据库操作的方法。

使用@Mapper注解的组件Model属性可以指定自动生成的接口实现类的组件类型,支持四种值:default、cdi、spring、jsr330。

@Data

        是Lombok中的一个注解,主要用于简化代码,提高开发效率。

        使用@Data注解可以省去代码中大量的get()、set()、toString()等方法,它会自动生成以下代码:所有字段的get和set方法、toString()方法,用于将对象转换成字符串形式,便于调试和日志输出、hashCode()方法,用于计算对象的哈希值、equals()方法,用于判断两个对象是否相等。此外,如果希望生成所有参数和指定参数的构造方法,可以使用@AllArgsConstructor或@RequiredArgsConstructor等其他Lombok注解。需要注意的是,如果在实体类中手动编写了一个带参数的构造方法,使用@Data注解会覆盖掉手动编写的构造方法

@Autowired

        可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。这里必须明确:@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用

@Configuration

用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Bean

是Spring框架中的注解,用于告诉Spring创建一个Bean对象,并将其放入Spring的IOC容器中管理。

使用@Bean注解可以有两种方式:

  • 用在类上 。例如@Controller、@Service、@Component、@Configuration、@Repository等注解,这些注解通常用在类上,然后通过无参构造函数创建对象并放入容器中。这种方式是由Spring自动创建对象。
  • 用在方法上 。将@Bean用在方法上,表示将该方法的返回值对象放到容器中。这种方式是由我们自己控制对象的创建。

使用@Bean注解的方法可以放在被@Controller、@Service、@Component、@Configuration、@Repository等注解的类中,这样在项目启动时,这些方法返回的对象也会被立即存入容器中。也可以直接用在启动类上。

@Component

是Spring框架中一个泛化的注解,通常是通过路径扫描来自动侦测以及自动装配到Spring容器中。

@Component注解作用于类,把普通pojo实例化到Spring容器中,相当于配置文件中的,泛指各种组件。比如当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),就可以使用@Component来标注这个类。

@Resource 

@Resource 注解是 Java EE 标准提供的注解,它用于消除代码中的硬编码,让开发人员能够轻松地将一个资源注入到代码中。它和 @Autowired 注解类似,可以自动装配 Spring 托管的 Bean,只是使用方式不同。

使用 @Resource 注解注入 Bean 时,可以指定 Bean 的名称或类型,示例如下:

@Component
public class UserServiceImpl implements UserService {

    @Resource(name = "userRepository")
    private UserRepository userRepository;

    ...
}

在上面的示例中,我们使用 @Resource 注解将 UserRepository 类型的 Bean 注入到 UserServiceImpl 类中的 userRepository 属性中。通过指定 name 属性来指定注入的 Bean 名称,也可以通过指定 type 属性来指定 Bean 的类型。如果没有指定 name 或 type 属性,则会自动按照属性类型进行匹配。

需要注意的是,Spring 还提供了 @Inject 注解来实现依赖注入,它和 @Autowired 注解类似,但是它是 JSR-330 标准提供的注解,不是 Java EE 标准提供的,使用方式和 @Autowired 也略有不同。

错误

        MYBATISE 类

resultMap 下的 result jdbcType属性中没有 INT 类型会报错  No enum constant org.apache.ibatis.type.JdbcType.INT 这表明在Mapper.xml文件中可能使用了JdbcType.INT,但实际上在org.apache.ibatis.type.JdbcType中没有这个枚举值。

jdbcType有26种类型有:REAL、VARCHAR、BINARY、BIT、FLOAT、CHAR、TIMESTAMP、OTHER、UNDEFINED、TINYINT、BLOB、NVARCHAR、SMALLINT、DOUBLE、DECIMAL、TIME、NULL、CURSOR、LONGVARCHAR、VARBINARY、CLOB、NCHAR、INTEGER、NUMERIC、DATE、LONGVARBINARY、BOOLEAN、NCLOB、BIGINT1。

程序类

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exc

        问题是一个常见的Java NPE(空指针异常)。在Spring MVC框架中,当dispatcherServlet处理请求时,如果遇到空指针异常,就会出现这样的错误消息。

空指针异常可能由以下几种原因引起:

  1. 你在控制器的方法参数中使用了某个对象,但请求处理该方法时,该对象为空。
  2. 你的控制器返回的对象为空。
  3. 查询出来的数据是null就是没有数据。
  4. 或者是使用其他包的对象缺少注解 @Autowired

spring boot

        HandlerInterceptor拦截器

        在spring boot中 无论是filter 过滤器还是interceptor 拦截器都是无法使用自动注入获取属性的,无论是在拦截器类中注入还是在new的实例中有自动注入的属性都会报空值异常,无法找到类;想在拦截器中使用自定义类或者其他ioc容器中的bean,可以在InterceptorConfiguration构建Interceptor时中填入属性值,因为在配置类中是可以使用自动注入的

示例:

        

这样即可 使用自定义类或者其他ioc容器中的bean

注意内容 

数据类型

long

long 长整型需要在 值后面加一个L 默认是通过int 整型隐式转换成 long 长整型 如果没有L 说明他是int 如果数值大于 int的最大字符就会报错

float

float 单精度浮点型 需要在值后面加一个F 默认是双精度浮点数 double 而双精度浮点类型 大于 float单精度浮点类型 不能进行转换所以 会报错

List

ArrayList   

如果整型数据需要根据内容进行删除 则需要 new  Integer(删除内容值) 已这种显示的形式删除

package com.example.demo.common;

import java.util.ArrayList;
import java.util.List;

public class Common {

    protected Common(){
       List auth = new ArrayList();
//        添加数据
        auth.add("name");
        auth.add(1);
        auth.add(2);
        auth.add(3);
        auth.add(4);
        System.out.println("add:"+auth);
//        更新数据 通过索引进行更新
        auth.set(0,5);
        System.out.println("set:"+auth);

        List auth1 = new ArrayList<>();
        auth1.add("www");
        auth1.add("com");
        auth1.add("cc");
        auth1.add("cn");
//      将其他集合所有内容 添加到当前内容
        auth.addAll(auth1);
        System.out.println("addAll:"+auth);
//       根据所有删除指定数据
        auth.remove(0);
        System.out.println("remove:"+auth);
//        根据内容删除指定数据
        auth.remove("www");
        System.out.println("remove:"+auth);
//        删除内容为4的数据  因为现在删除数据是默认根据索引进行删除 如果整型数据需要根据内容进行删除 则需要 new  Integer(删除内容值) 已这种显示的形式删除
        auth.remove(4);
        System.out.println("remove:"+auth);
        auth.remove(new Integer(4));
        System.out.println("remove:"+auth);
//        根据查询的内容返回第一次出现的数据对应索引下标 如果找不到返回 -1
        System.out.println("indexOf:"+auth.indexOf("cc"));
//      清空指定集合的内容
        auth.removeAll(auth1);
        System.out.println("removeAll:"+auth);
//      判断集合是否为空
        System.out.println("isEmpty:"+auth.isEmpty());
//        获取当前集合的数据数量
        System.out.println("size:"+auth.size());
        List auth2 = new ArrayList<>();
        auth2.add(1);
        auth2.add(2);
//      判断当前集合是否包含另一个集合的全部内容
        System.out.println("containsAll:"+auth.containsAll(auth2));
//        判断当前集合是否 包含某个值
        System.out.println("contains:"+auth.contains(1));
//        replaceAll方法用于替换列表中所有满足某个条件的元素
//        这个方法接受一个UnaryOperator<E>作为参数,这是一个函数接口,它接受列表中的每个元素,并返回一个新的元素来替换原来的元素。
//        这个例子中,replaceAll方法接受一个lambda表达式 s -> s.equals(1) 作为参数。这个lambda表达式对列表中的每个元素执行,将每个字符串进行判断是否等于1,如果等于1则替换成true否则false
        auth.replaceAll(s->s.equals(1));
        System.out.println("replaceAll:"+auth);
//        清空数据
        auth.clear();
        System.out.println("clear:"+auth);
//      判断集合是否为空
        System.out.println("isEmpty:"+auth.isEmpty());


    }

}

接口

OncePerRequestFilter过滤器接口  

OncePerRequestFilter 是 Spring 框架提供的过滤器抽象类,用于在请求处理之前或之后执行一些通用的处理逻辑,常见的应用场景包括:

  • 鉴权,判断用户是否有权限访问资源
  • 全局异常处理
  • 统一添加响应头等

OncePerRequestFilter 实现了 javax.servlet.Filter 接口,并在内部实现了doFilter()方法,封装了具体的 Filter 处理流程,保证每个 Request 只执行一次。我们只需要在派生类中实现doFilterInternal() 方法即可,该方法的参数是 HttpServletRequest 和 HttpServletResponse 对象。例如:

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        // 从请求头中获取 Jwt Token
        String token = jwtTokenProvider.resolveToken(request);

        // 验证 Jwt Token,并从中获取用户信息
        if (StringUtils.hasText(token) && jwtTokenProvider.validateToken(token)) {
            Authentication authentication = jwtTokenProvider.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        // 继续处理请求
        filterChain.doFilter(request, response);
    }
}

在上面的代码中,我们实现了一个 JwtAuthenticationFilter 过滤器,用于从请求头中提取 JWT Token,并校验和解析 Token,将用户信息存储到 Spring Security 上下文中。这样在后续处理请求时,就可以通过 SecurityContextHolder 获取到用户信息。然后,我们将该过滤器定义为 Spring Bean,以便在 WebSecurityConfig 中进行配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationFilter jwtAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // ...
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

在上面的代码中,我们使用 addFilterBefore() 方法将 JwtAuthenticationFilter 过滤器添加到 UsernamePasswordAuthenticationFilter 过滤器之前,这样就能够保证在 UsernamePasswordAuthenticationFilter 过滤器中对用户进行身份认证之前,先执行 JwtAuthenticationFilter 过滤器中的逻辑。

HandlerInterceptor拦截器

 是 Spring 框架提供的拦截器接口,可用于在请求处理之前或之后执行一些通用的处理逻辑,例如:

  • 认证用户请求的权限
  • 记录请求日志
  • 统计请求时长等

HandlerInterceptor 接口有三个方法:

  1. preHandle():在请求处理之前执行。可以用来进行拦截请求等操作。
  2. postHandle():在请求处理之后执行。可以用来进行处理请求结果等操作。
  3. afterCompletion():在完成请求处理之后执行。用于清理资源等操作。

在 SpringMVC 的配置文件中,可以通过 addInterceptor() 方法注册一个 HandlerInterceptor 拦截器,并指定要拦截的 URL。例如:

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private LogInterceptor logInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor).addPathPatterns("/**");
    }
}

在上面的代码中,我们定义了一个 LogInterceptor 拦截器,并注册到 InterceptorRegistry 中,然后使用 addPathPatterns() 方法指定要拦截的 URL(这里是所有 URL)。从而实现了在所有请求之前和之后均执行 LogInterceptor 中的业务逻辑。

WebMvcConfigurer配置接口

WebMvcConfigurer 是 Spring MVC 框架提供的一个配置接口,用于扩展和自定义 Spring MVC 的功能。通过实现 WebMvcConfigurer 接口,我们可以进行一些常见的配置操作,例如:

  • 添加拦截器
  • 修改视图解析器
  • 自定义消息转换器等

当我们需要通过自定义配置来对 Spring MVC 进行特定的操作时,就可以实现 WebMvcConfigurer 接口,并在其中实现相应的方法。例如:

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyHandlerInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/login");
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

在上面的代码中,我们实现了一个 MvcConfig 类,并实现了 WebMvcConfigurer 接口中的几个方法。其中,addInterceptors() 方法用于添加拦截器,configureViewResolvers() 方法用于修改视图解析器,configureMessageConverters() 方法用于添加自定义的消息转换器。这样,就可以通过 MvcConfig 类来配置 Spring MVC 的相关功能。

需要注意的是,当我们实现 WebMvcConfigurer 接口时,可以只重写需要自定义的方法,而不需要全部重写。并且,在 Spring Boot 中,只需要将 WebMvcConfigurer 的实现类定义为 Spring Bean 即可,Spring Boot 会自动将其加入 Spring MVC 配置中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/111489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...

全文链接:http://tecdat.cn/?p27384 在本文中&#xff0c;数据包含有关葡萄牙“Vinho Verde”葡萄酒的信息&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 介绍 该数据集&#xff08;查看文末了解数据获取方式&#xff09;有1599个观测值和12个变量&#xf…

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

近年来&#xff0c;数字化转型成为证券业发展的下一战略高地&#xff0c;根据 2021 年证券业协会专项调查结果显示&#xff0c;71% 的券商将数字化转型列为公司战略任务。 在落地数字化转型战略过程中&#xff0c;证券业核心交易系统面临着不少挑战。构建新一代分布式核心交易…

长沙某公司面经总结 - 失败版

1.Java语言的特征 Java的三大特性&#xff1a;封装、继承、多态 面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征&#xff1a; 继承&#xff1a;继承是从已有类得到继承信息创建新类的过程 封装&#xff1a;封装是把数据和操作数据的方法绑定起来&#xff0c;对…

快速入门:使用 Spring Boot 构建 Web 应用程序

前言 本文将讨论以下主题&#xff1a; 安装 Java JDK、Gradle 或 Maven 和 Eclipse 或 IntelliJ IDEA创建一个新的 Spring Boot 项目运行 Spring Boot 应用程序编写一个简单的 Web 应用程序打包应用程序以用于生产环境 通过这些主题&#xff0c;您将能够开始使用 Spring Boo…

Fourier分析导论——第2章——Fourier级数的基本属性(E.M. Stein R. Shakarchi)

第 2 章 Fourier级数的基本属性(Basic Properties of Fourier Series) Nearly fifty years had passed without any progress on the question of analytic representation of an arbitrary function, when an assertion of Fourier threw new light on the subject. Thus…

前端环境的安装 Node npm yarn

一 node npm 1.下载NodeJS安装包 下载地址&#xff1a;Download | Node.js 2.开始安装 打开安装包后&#xff0c;一直Next即可。当然&#xff0c;建议还是修改一下安装位置&#xff0c;NodeJS默认安装位置为 C:\Program Files 3.验证是否安装成功 打开DOS命令界面&#…

基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

无线振动传感器安装

lora无线温振一体传感器即传感器的采集时间&#xff0c;采集方式完全有主机通过命令实现。其主要特点是&#xff1a;传感器平时处在低功耗状态、传感器可以随时响应远程主机控制命令、传感器可采集特征值或者原始加速度数据 lora 技术&#xff0c;提高了传输速率多振动&#xf…

程序开发官网地址汇总

这里写目录标题 官网地址汇总开发环境开发工具数据库驱动包其他 官网地址汇总 开发环境 1 JDK &#xff1a;https://www.oracle.com/java/technologies/java-se-glance.html 2 Maven&#xff1a;https://maven.apache.org/download.cgi 3 Maven Repository: https://mvnrep…

项目管理-挣值管理例题-使用SV进度偏差和CV成本偏差来判断进度和成本是否合适

基础概念介绍 CV和SV的计算公式 在财务分析中&#xff0c;常常会用到CV和SV这两个指标。CV是成本偏差&#xff0c;SV是进度偏差。它们的计算公式如下&#xff1a; CV EV - AC SV EV - PV 其中&#xff0c;EV是挣值&#xff0c;AC是实际成本&#xff0c;PV是计划价值。 …

Qt之基于QCustomPlot绘制直方图(Histogram),叠加正态分布曲线

一.效果 二.原理 1.正态分布 高斯分布(Gaussian distribution),又名正态分布(Normal distribution),也称"常态分布",也就是说,在正常的状态下,一般的事物,都会符合这样的分布规律。 比如人的身高为一个随机变量,特别高的人比较少,特别矮的也很少,大部分都…

idea插件(一)-- SequenceDiagram(UML自动生成工具)

目录 1. 安装 2. 默认快捷键 3. 操作说明 4. 导出为图片与UML类图 4.1 导出为图片&#xff1a; 4.2 导出 UML 类图 SequenceDiagram是从java、kotlin、scala&#xff08;Beta&#xff09;和groovy&#xff08;limited&#xff09;代码生成简单序列图&#xff08;UML&…

【Java】多线程案例(单例模式,阻塞队列,定时器,线程池)

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 实现安全版本的单例模式饿汉模式类和对象的概念类对象类的静态成员与实例成员 懒汉模式如何保证…

微信小程序面试题之理论篇

本文内容&#xff0c;来源于极客学院的分享&#xff0c;这里只做引用。 说说你对微信小程序的理解?优缺点? 背景 小程序与H5 优缺点 优点&#xff1a;缺点&#xff1a; 说说微信小程序的生命周期函数有哪些&#xff1f; 应用的生命周期页面的生命期组件的生命周期执行过程 应…

【前端早早聊直播回顾】Harmony Next 与 Flutter 的不解之缘

Hello 大家好&#xff0c;我是 Flutter GDE 郭树煜&#xff0c;本次要分享的话题是关于鸿蒙与 Flutter 的故事&#xff0c;可能没接触过的会感觉有点懵&#xff0c;Harmony 和 Flutter 有啥关系&#xff0c;它们怎么会被放到一起讲了呢&#xff1f;接下来就让我们来聊聊这个问题…

Apache Dolphinscheduler如何不重启解决Master服务死循环

个人建议 Apache Dolphinscheduler作为一个开源的调度平台&#xff0c;目前已经更新到了3.X版本&#xff0c;4.0版本也已经呼之欲出。3.0版本作为尝鲜版本&#xff0c;新添加了许多的功能&#xff0c;同时也存在非常多的隐患&#xff0c;本人使用3.0版本作为生产调度也踩了很多…

【C++】C++11常见特性

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Selenium3-获取元素的css属性

来个元素CSS值 代码1: 通过javaScript执行脚本获取css值 String jsStr "return document.getElementById(\"buyers\").style.getPropertyValue(width)"; Object o ((JavascriptExecutor) driver).executeScript(jsStr); System.out.println(o.toString(…

机器学习-特征工程

一、特征工程介绍 1.1 什么是特征 数值特征&#xff08;连续特征&#xff09;、文本特征&#xff08;离散特征&#xff09; 1.2 特征的种类 1.3 特征工程 特征是机器学习可疑直接使用的&#xff0c;模型和特征之间是一个循环过程&#xff1b; 实际上特征工程就是将原始数据…

[ poi-表格导出 ] java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader

解决报错&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错描述&#xff1a; 表格导出本来使用正常&#xff0c;偶然就报了以上错误…