springboot嘟嘟程序猿

SpringBoot--实战开发--常用配置(二十二)

2019-07-15  本文已影响8人  无剑_君

一、关于缓存时间过期

  1. 缓存配置类
@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;
    }
}
  1. 测试:
    /**
     * 如果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
上一篇下一篇

猜你喜欢

热点阅读