spring

springboot build.gradle with profile

$ bootRun -Dspring.profiles.active=dev


//build.gradle
bootRun {
    systemProperties = System.properties
}

spring redis session

cookie 默认名称 SESSION 自定义
@Bean
public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter(SessionRepository<S> sessionRepository, ServletContext servletContext) {
    SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<S>(sessionRepository);
    sessionRepositoryFilter.setServletContext(servletContext);
    CookieHttpSessionStrategy httpSessionStrategy = new CookieHttpSessionStrategy();
    httpSessionStrategy.setCookieName("MY_SESSION_NAME");
    sessionRepositoryFilter.setHttpSessionStrategy(httpSessionStrategy);
    return sessionRepositoryFilter;
}

https://stackoverflow.com/questions/33095345/how-to-change-spring-session-redis-cookie-name

spring boot global DateTimeFormat

修复@DateTimeFormat注解失效问题

    @Bean
    public ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
        ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
        FormattingConversionService conversionService = new WebConversionService("yyyy-MM-dd");//gobal without @DateTimeFormat
        new DateFormatterRegistrar().registerFormatters(conversionService); //annotation supported
        //we can add our custom converters and formatters
        //conversionService.addFormatter(...);
        initializer.setConversionService(conversionService);
        //we can set our custom validator
        //initializer.setValidator(....);

        //here we are setting a custom PropertyEditor
        /*    initializer.setPropertyEditorRegistrar(propertyEditorRegistry -> {
            SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
            propertyEditorRegistry.registerCustomEditor(Date.class,
                    new CustomDateEditor(dateFormatter, true));
        });*/
        return initializer;
    }

spring global string to enum converter factory 自动转化枚举类型作为参数

public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {

    @Override
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
        return new StringToEnumConverter<>(targetType);
    }

    private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> {

        private Class<T> enumType;

        StringToEnumConverter(Class<T> enumType) {
            this.enumType = enumType;
        }

        public T convert(String source) {
            return (T) Enum.valueOf(this.enumType, source.trim());
        }
    }
}
 conversionService.addConverterFactory(new StringToEnumConverterFactory());

无需注入静态方法获取httpServletRequest & applicationContext

public class ContextHolder {

    public static HttpServletRequest getRequest() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes instanceof ServletRequestAttributes) {
            return ((ServletRequestAttributes) requestAttributes).getRequest();
        }
        log.debug("Not called in the context of an HTTP request");
        return null;
    }

    public static ApplicationContext getContext() {
        HttpServletRequest request = getRequest();
        if(request != null) {
            return WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
        }
        log.debug("Not called in the context of an HTTP request");
        return null;
    }


}