spring-projects / spring-projects/spring-session

Spring Session Redis with Jasper dependency serializes jakarta.servlet.jsp.jstl.fmt.LocalizationContext

Open
#3,255 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

status: waiting-for-triage type: bug
Dominant language
Java
Stars
1.9k
Forks
1.2k
Avg merge
4h 27m
Merged PRs (30d)
55

Description

Environment: Spring Boot - 3.3.3 and Spring Cloud - 2023.0.2
In microservice with jasper (=Servlet Container to generate js Files) dependency added Spring Redis Session dependency to manage Sessions via Redis Server, but SessionRepositoryFilter throws Exceptions . e.g. this one....

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [jakarta.servlet.jsp.jstl.fmt.LocalizationContext]

Configuration:

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http,
    										RequestMatcherBuilder mvc) throws Exception {
    	
        return http
            .authorizeHttpRequests(auth ->
            		auth.dispatcherTypeMatchers( DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.REQUEST ).permitAll()
            		    .requestMatchers(mvc.matchers(HttpMethod.GET, "/", "/home")).permitAll()
            		    .requestMatchers(mvc.matchers(HttpMethod.GET, "/repository", "/someother")).authenticated()
            		    .anyRequest().authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2.jwt(withDefaults()))
            //.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED))
            .csrf(csrf -> csrf.disable())
            .build();
    }

pom dependencies


		<dependency>
		  <groupId>org.springframework.boot</groupId>
		  <artifactId>spring-boot-starter-data-redis</artifactId>
		  <exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
 		
 		<dependency>
		  <groupId>org.springframework.session</groupId>
		  <artifactId>spring-session-data-redis</artifactId>
		</dependency>

		<!-- tomcat: jasper -->
		<dependency>
                    <groupId>org.apache.tomcat.embed</groupId>
                    <artifactId>tomcat-embed-jasper</artifactId>
                    <scope>provided</scope>
                </dependency>
     	  
                <dependency>
			 <groupId>jakarta.servlet.jsp.jstl</groupId>
    		        <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
                </dependency>
       
               <dependency>
		       <groupId>org.glassfish.web</groupId>
		       <artifactId>jakarta.servlet.jsp.jstl</artifactId>		  
		</dependency>

some other.....
@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession//(redisNamespace = "gateway:session")
public class SessionConfig {// implements BeanClassLoaderAware {

	@Bean
	LettuceConnectionFactory redisConnectionFactory() {
		return new LettuceConnectionFactory(); 
	}
}	

`
.yml


server:
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
    session:
      timeout: 480m
      cookie:
        name: GATEWAY-SESSION
spring:
  main:
    allow-bean-definition-overriding: true
  mvc:
    servlet:
      path: /
  session:
    redis:
      repository-type: default
      flush-mode: on_save
      namespace: gateway:session
  data:
    redis:
      host: localhost
      port: 6379
      database: 0
      timeout: 30000

Results in Exception Report

Message Cannot serialize

Description The request has not been applied to the target resource because it lacks valid authentication credentials for that resource.

Exception

org.springframework.data.redis.serializer.SerializationException: Cannot serialize
	org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:94)
	org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:186)
	org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:161)
	org.springframework.session.data.redis.RedisSessionRepository$RedisSession.saveDelta(RedisSessionRepository.java:328)
	org.springframework.session.data.redis.RedisSessionRepository$RedisSession.save(RedisSessionRepository.java:306)
	org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:132)
	org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:45)
	org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:229)
	org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:145)
	org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
	org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	org.springframework.web.filter.ForwardedHeaderFilter.doFilterInternal(ForwardedHeaderFilter.java:173)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)

Root Cause

org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer
	org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:64)
	org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:33)
	org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:92)
	org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:186)
	org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:161)
	org.springframework.session.data.redis.RedisSessionRepository$RedisSession.saveDelta(RedisSessionRepository.java:328)
	org.springframework.session.data.redis.RedisSessionRepository$RedisSession.save(RedisSessionRepository.java:306)
	org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:132)
	org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:45)
	org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:229)
	org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:145)
	org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
	org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	org.springframework.web.filter.ForwardedHeaderFilter.doFilterInternal(ForwardedHeaderFilter.java:173)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)

Root Cause

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [jakarta.servlet.jsp.jstl.fmt.LocalizationContext]
	org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
	org.springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56)
	org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60)
	org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:33)
	org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:92)
	org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:186)
	org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:161)
	org.springframework.session.data.redis.RedisSessionRepository$RedisSession.saveDelta(RedisSessionRepository.java:328)
	org.springframework.session.data.redis.RedisSessionRepository$RedisSession.save(RedisSessionRepository.java:306)
	org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:132)
	org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:45)
	org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:229)
	org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:145)
	org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
	org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:113)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
	org.springframework.web.filter.ForwardedHeaderFilter.doFilterInternal(ForwardedHeaderFilter.java:173)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)

Note The full stack trace of the root cause is available in the server logs.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The report names no repository files or tests. Start by reproducing the configuration with Spring Boot 3.3.3, Spring Session Redis, and Jasper, then trace the failure from RedisSessionRepository.saveDelta through JdkSerializationRedisSerializer to determine how LocalizationContext reaches the session. Done means the session saves successfully without the serialization exception.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, redis, spring, spring-boot
Domain
backend, databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.