SpringBoot 开发秘籍 - 启动时配置校验

在项目开发过程中,某个功能需要依赖在配置文件中配置的参数。这时候就可能出现下面这种现象问题:

有时候经常出现项目启动了,等到使用某个功能组件的时候出现异常,提示参数未配置或者bean注入失败。

有没有一种方法在项目启动时就对参数进行校验而不是在实际使用的时候再抛出提示呢?

答案就是使用Spring提供的Java Validation功能,简单实用。

增加启动校验


只需要在我们创建的配置Properties类增加Validation相关配置即可

@Validated

@Data

@ConfigurationProperties(prefix = “app”)

@Component

public class AppConfigProperties {

@NotEmpty(message = “配置文件配置必须要配置[app.id]属性”)

private String id;

}

上面的配置就会校验我们在 application.yml中有没有配置 app.id参数。如果在配置文件中没有该配置,项目启动就会失败,并抛出校验异常。

在使用配置文件校验时,必须使用@configurationproperties注解,@value不支持该注解。

在需要使用app.id的时候注入配置类即可:

@Autowired

private AppConfigProperties appConfigProperties;

这样就可以实现我们想要的效果,如下图:

效果

校验类型

| 校验规则 | 规则说明 |

| — | — |

| @Null | 限制只能为null |

| @NotNull | 限制必须不为null |

| @AssertFalse | 限制必须为false |

| @AssertTrue | 限制必须为true |

| @DecimalMax(value) | 限制必须为一个不大于指定值的数字 |

| @DecimalMin(value) | 限制必须为一个不小于指定值的数字 |

| @Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |

| @Future | 限制必须是一个将来的日期 |

| @Max(value) | 限制必须为一个不大于指定值的数字 |

| @Min(value) | 限制必须为一个不小于指定值的数字 |

| @Past | 验证注解的元素值(日期类型)比当前时间早 |

| @Pattern(value) | 限制必须符合指定的正则表达式 |

| @Size(max,min) | 限制字符长度必须在min到max之间 |

| @NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |

| @NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |

| @Email | 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |

Validation 支持如下几种校验,可以满足基本的业务逻辑,当然如果还是满足不了你的业务逻辑,可以选择定制校验规则。

定制校验逻辑

  1. 定义校验逻辑规则,实现 org.springframework.validation.Validator

public class ConfigPropertiesValidator implements Validator {

@Override

public boolean supports(Class<?> aClass) {

return AppConfigProperties.class.isAssignableFrom(aClass);

}

@Override

public void validate(Object o, Errors errors) {

AppConfigProperties config = (AppConfigProperties) o;

if(StringUtils.isEmpty(config.getId())){

errors.rejectValue(“id”, “app.id.empty”, “[app.id] 属性必须要在配置文件配置”);

}else if (config.getId().length() < 5) {

errors.rejectValue(“id”, “app.id.short”, “[app.id] 属性的长度必须不能小于5”);

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

一线互联网大厂Java核心面试题库

image

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个快速开发应用程序的框架,Spring Security是一个安全框架,可以对应用程序进行身份验证和授权。在Spring Boot中,可以将Spring Security与应用程序集成,实现对用户身份验证和授权的支持。 以下是在Spring Boot中整合Spring Security进行权限校验的步骤: 1. 添加Spring Security依赖 在build.gradle或pom.xml中添加Spring Security依赖: ``` implementation 'org.springframework.boot:spring-boot-starter-security' ``` 2. 创建Spring Security配置类 创建一个继承自WebSecurityConfigurerAdapter的配置类: ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private BCryptPasswordEncoder bCryptPasswordEncoder; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable().authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() .and().formLogin() .and().logout().logoutUrl("/logout").logoutSuccessUrl("/login") .permitAll(); } } ``` 在configure方法中配置Spring Security: - 配置用户认证,使用UserDetailsService实现类和BCryptPasswordEncoder进行密码加密 - 配置请求授权,指定请求路径需要哪些角色才能访问 - 配置登录页面和登出路径 3. 创建用户实体类和用户认证实现类 创建一个用户实体类和一个实现UserDetailsService接口的用户认证实现类: ``` @Entity @Table(name = "users") public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "username") private String username; @Column(name = "password") private String password; @Column(name = "enabled") private boolean enabled; @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles = new HashSet<>(); // getters and setters @Override public Collection<? extends GrantedAuthority> getAuthorities() { return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList()); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } } ``` ``` @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } return user; } } ``` 4. 创建角色实体类和角色认证实现类 创建一个角色实体类和一个实现GrantedAuthority接口的角色认证实现类: ``` @Entity @Table(name = "roles") public class Role implements GrantedAuthority { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; // getters and setters @Override public String getAuthority() { return name; } } ``` ``` @Service public class RoleServiceImpl implements RoleService { @Autowired private RoleRepository roleRepository; @Override public Role findByName(String name) { return roleRepository.findByName(name); } } ``` 5. 创建控制器 创建一个控制器,用于测试权限校验: ``` @RestController public class TestController { @GetMapping("/admin") public String admin() { return "Hello Admin"; } @GetMapping("/user") public String user() { return "Hello User"; } } ``` 6. 启动应用程序 现在可以启动应用程序并访问控制器中的/admin和/user路径。只有具有相应角色的用户才能访问。 以上是在Spring Boot中整合Spring Security进行权限校验的步骤,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值