美文网首页springboot嘟嘟程序猿
SpringBoot--实战开发--常用配置(二十二)

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

作者: 无剑_君 | 来源:发表于2019-07-15 17:12 被阅读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
    

    相关文章

      网友评论

        本文标题:SpringBoot--实战开发--常用配置(二十二)

        本文链接:https://www.haomeiwen.com/subject/xlemzqtx.html