一、关于缓存时间过期
- 缓存配置类
@Configuration
@EnableCaching
public class RedisConfiguration {
@Resource
private LettuceConnectionFactory lettuceConnectionFactory;
@Bean
public RedisTemplate<String, Serializable> redisTemplate() {
RedisTemplate<String, Serializable> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(lettuceConnectionFactory);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
config = config.entryTtl(Duration.ofMinutes(2))
// 设置缓存的默认过期时间,也是使用Duration设置
.disableCachingNullValues();
// 不缓存空值
/**
* 设置一个初始化的缓存空间set集合
* 如果设置为以下键,将会有过期时间
*/
Set<String> cacheNames = new HashSet<>();
cacheNames.add("catalog_test_id");
cacheNames.add("catalog_test_name");
// 对每个缓存空间应用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("catalog_test_id", config);
configMap.put("catalog_test_name", config.entryTtl(Duration.ofMinutes(5)));
RedisCacheManager cacheManager = RedisCacheManager.builder(factory) // 使用自定义的缓存配置初始化一个cacheManager
.initialCacheNames(cacheNames) // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
}
- 测试:
/**
* 如果vaule设置了缓管理里的key,将会有过期时间,否则没有
* @param id
* @return
*/
@Override
// @Cacheable(value="user", key="'users_'+#id")
@Cacheable(value = "catalog_test_id",key ="#id")
public User getUser(Long id) {
Optional<User> optionalUser = userRepository.findById(id);
if(optionalUser.isPresent()){
return optionalUser.get();
}
return null;
}
二、日期格式化(JSON)
1. 注解式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
protected LocalDateTime updateTime; // 更新日期
2. 配置式
@Configuration
public class LocalDateTimeSerializerConfig {
@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
private String pattern;
@Bean
public LocalDateTimeSerializer localDateTimeDeserializer() {
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
}
}
三、外置的tomcat启动
默认的启动类要继承SpringBootServletInitiailzer类,并复写configure()方法。
public class WebBootServletInitializer extends SpringBootServletInitializer {
/**
* 复写configure()方法
* @param builder
* @return
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 默认启动类
return builder.sources(WebBootApplication.class);
}
}
四、PropertyEditorSupport
Spring容器启动大致可以分为两个阶段:
1.启动容器
首先Spring会通过你的配置文件,加载配置信息,分析配置信息,然后会把分析后的信息组成相应的BeanDefinition,最后把这些保存到bean定义必须的BeanDefinition,注册到相应的BeanDefinitionRegistry,这样容器就基本启动了。
注意:这时候还没有实例化Bean,只是保存了配置文件的信息。
Spring默认有很多的PropertyEditor,如果够用也可以不自定义一个PropertyEditor。
首先,我们需要编写自己的PropertyEditor,通常是继承PropertyEditorSupport,而不用实现PropertyEditor,这样就不用重写PropertyEditor的所有方法了。
将“2007-10-16”转换成一个日期格式的数据。
public class DateConvertEditor extends PropertyEditorSupport {
public void setAsText(String text) throws IllegalArgumentException {
if (StringUtils.hasText(text)) {
try {
// 将字符串转为日期格式
setValue(DateUtils.parseDate(text));
} catch (Exception ex) {
IllegalArgumentException iae = new IllegalArgumentException("时间格式不正确: " + ex.getMessage());
iae.initCause(ex);
throw iae;
}
} else {
setValue(null);
}
}
}
五、数据校验
@Null 只能是null
@NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值
@AssertFalse 必须为false
@AssertTrue 必须是true
字符串/数组/集合检查:(字符串本身就是个数组)
@Pattern(regexp="reg") 验证字符串满足正则
@Size(max, min) 验证字符串、数组、集合长度范围
@NotEmpty 验证字符串不为空或者null
@NotBlank 验证字符串不为null或者trim()后不为空
数值检查:同时能验证一个字符串是否是满足限制的数字的字符串
@Max 规定值得上限int
@Min 规定值得下限
@DecimalMax("10.8") 以传入字符串构建一个BigDecimal,规定值要小于这个值
@DecimalMin 可以用来限制浮点数大小
@Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2
@Digits 无参数,验证字符串是否合法
@Range(min=long1,max=long2) 检查数字是否在范围之间
这些都包括边界值
日期检查:Date/Calendar
@Post 限定一个日期,日期必须是过去的日期
@Future 限定一个日期,日期必须是未来的日期
其他验证:
@Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
@URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法URL
1. 方法参数 @Valid注解
实体类:
@NotNull(message = "角色名称不能为空")
private String name;
控制器:
public Result add(@Valid @RequestBody Role role, BindingResult result){
// 获取校验信息
if(result.hasErrors()){
String error=result.getFieldError().getDefaultMessage();
}
}
如果数据错误,将会抛出异常。
异常
说明:
必须添加参数注解才能够进行数据校验,在方法中可以获取校验数据。
2. 类注解@Validated
@Validated
public class RoleController extends BaseEntityController<Role> {
}
说明:
如果类添加了注解@Validated,方法添加参数注解:@Valid
则不会执行控制器方法,进行数据校验。
六、国际化
Spring中可以使用两个类加载资源文件:ReloadableResourceBundleMessageSource和ResourceBundleMessageSource。
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setCacheSeconds(10); //reload messages every 10 seconds
messageSource.setDefaultEncoding("UTF-8");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
配置文件配置:
# 国际化
spring.messages.encoding=utf-8
# 国际化配置文件路径
spring.messages.basename=i18n/messages,i18n/ValidationMessages
网友评论