Spring 备忘

Gradle bootRun 传 profile

bootRun -Dspring.profiles.active=dev

build.gradle

bootRun {
    systemProperties = System.properties
}

默认 Cookie 名多为 SESSION

@Bean
public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession>
        springSessionRepositoryFilter(SessionRepository<S> sessionRepository,
                                      ServletContext servletContext) {
    SessionRepositoryFilter<S> filter = new SessionRepositoryFilter<>(sessionRepository);
    filter.setServletContext(servletContext);
    CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
    strategy.setCookieName("MY_SESSION_NAME");
    filter.setHttpSessionStrategy(strategy);
    return filter;
}

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

新版本 API 可能改为 CookieHttpSessionIdResolver 等,以当前 Spring Session 文档为准。


全局日期格式(缓解 @DateTimeFormat 不生效)

@Bean
public ConfigurableWebBindingInitializer configurableWebBindingInitializer() {
    ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
    FormattingConversionService conversionService = new WebConversionService("yyyy-MM-dd");
    new DateFormatterRegistrar().registerFormatters(conversionService);
    initializer.setConversionService(conversionService);
    return initializer;
}

String → Enum 参数转换

public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {

    @Override
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
        return source -> (T) Enum.valueOf(targetType, source.trim());
    }
}

// 注册
conversionService.addConverterFactory(new StringToEnumConverterFactory());

静态方法取 Request / ApplicationContext

仅在 Web 请求线程内可靠。

public final class ContextHolder {

    private ContextHolder() {}

    public static HttpServletRequest getRequest() {
        RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
        if (attrs instanceof ServletRequestAttributes) {
            return ((ServletRequestAttributes) attrs).getRequest();
        }
        return null;
    }

    public static ApplicationContext getContext() {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }
        return WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
    }
}