是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染
是Spring Framework中的注解,用于标识一个类是控制器组件。在Spring MVC(Model-View-Controller)架构中扮演重要角色,负责处理来自客户端的HTTP请求,协调业务逻辑的处理,并根据请求返回适当的视图或数据
是Spring MVC框架中的注解,用于将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到Response对象的Body区,通常用来返回JSON或XML数据。
@ResponseBody注解的作用是将方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,例如AJAX。需要注意的是,如果使用了@RequestMapping注解,返回值通常会被解析为跳转路径,但加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。例如,异步获取json数据,加上@ResponseBody后,会直接返回json数据。
是Spring框架中用于处理请求地址映射的注解,可用于类或方法上。当用于类上时,表示类中的所有响应请求的方法都是以该地址作为父路径;当用于方法上时,表示该方法处理请求的地址映射。
注解有六个属性,下面将其分成三类进行说明:
value
:指定请求映射的URL路径。method
:指定请求的方法类型,如GET、POST等。params
:指定请求的参数,如查询参数等。headers
:指定请求中必须包含某些指定的header值,才能让该方法处理请求。consumes
:指定请求的内容类型,即消费的内容类型。produces
:指定响应的内容类型,即生产的内容类型。@GetMapping和@PostMapping是Spring框架中用于处理不同HTTP请求方法的注解。
用于处理HTTP GET请求 是@RequestMapping(method = RequestMethod.GET)的缩写
用于处理HTTP POST请求。是@RequestMapping(method = RequestMethod.POST)的缩写
这两个注解的作用是将HTTP请求映射到特定的处理方法上,使得在后端代码中可以针对不同的请求进行相应的处理
如果是get请求 则使用 @RequestParam 注解直接接收参数
如果是post请求则使用 @RequestBody 注解 接收json参数
是spring boot注解 标明当前是启动文件
是MyBatis框架的注解,用于标识接口,这个接口定义了数据库操作的方法。
使用@Mapper注解的组件Model属性可以指定自动生成的接口实现类的组件类型,支持四种值:default、cdi、spring、jsr330。
是Lombok中的一个注解,主要用于简化代码,提高开发效率。
使用@Data注解可以省去代码中大量的get()、set()、toString()等方法,它会自动生成以下代码:所有字段的get和set方法、toString()方法,用于将对象转换成字符串形式,便于调试和日志输出、hashCode()方法,用于计算对象的哈希值、equals()方法,用于判断两个对象是否相等。此外,如果希望生成所有参数和指定参数的构造方法,可以使用@AllArgsConstructor或@RequiredArgsConstructor等其他Lombok注解。需要注意的是,如果在实体类中手动编写了一个带参数的构造方法,使用@Data注解会覆盖掉手动编写的构造方法
可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。这里必须明确:@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
是Spring框架中的注解,用于告诉Spring创建一个Bean对象,并将其放入Spring的IOC容器中管理。
使用@Bean注解可以有两种方式:
使用@Bean注解的方法可以放在被@Controller、@Service、@Component、@Configuration、@Repository等注解的类中,这样在项目启动时,这些方法返回的对象也会被立即存入容器中。也可以直接用在启动类上。
是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
也略有不同。
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处理请求时,如果遇到空指针异常,就会出现这样的错误消息。
空指针异常可能由以下几种原因引起:
HandlerInterceptor
拦截器在spring boot中 无论是filter 过滤器还是interceptor 拦截器都是无法使用自动注入获取属性的,无论是在拦截器类中注入还是在new的实例中有自动注入的属性都会报空值异常,无法找到类;想在拦截器中使用自定义类或者其他ioc容器中的bean,可以在InterceptorConfiguration构建Interceptor时中填入属性值,因为在配置类中是可以使用自动注入的
示例:
这样即可 使用自定义类或者其他ioc容器中的bean
long 长整型需要在 值后面加一个L 默认是通过int 整型隐式转换成 long 长整型 如果没有L 说明他是int 如果数值大于 int的最大字符就会报错
float 单精度浮点型 需要在值后面加一个F 默认是双精度浮点数 double 而双精度浮点类型 大于 float单精度浮点类型 不能进行转换所以 会报错
如果整型数据需要根据内容进行删除 则需要 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作为参数,这是一个函数接口,它接受列表中的每个元素,并返回一个新的元素来替换原来的元素。
// 这个例子中,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
是 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
接口有三个方法:
preHandle()
:在请求处理之前执行。可以用来进行拦截请求等操作。postHandle()
:在请求处理之后执行。可以用来进行处理请求结果等操作。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> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
}
在上面的代码中,我们实现了一个 MvcConfig
类,并实现了 WebMvcConfigurer
接口中的几个方法。其中,addInterceptors()
方法用于添加拦截器,configureViewResolvers()
方法用于修改视图解析器,configureMessageConverters()
方法用于添加自定义的消息转换器。这样,就可以通过 MvcConfig
类来配置 Spring MVC 的相关功能。
需要注意的是,当我们实现 WebMvcConfigurer
接口时,可以只重写需要自定义的方法,而不需要全部重写。并且,在 Spring Boot 中,只需要将 WebMvcConfigurer
的实现类定义为 Spring Bean 即可,Spring Boot 会自动将其加入 Spring MVC 配置中。