spring-session-data-mongodb icon indicating copy to clipboard operation
spring-session-data-mongodb copied to clipboard

ConversionFailedException while using MongoDB session

Open akashgupta2703 opened this issue 3 years ago • 2 comments

We are noticing a lot of ConversionFailedException for MongoDB Sessions in our logs. Following is the sample logs for reference. All the logs are similar with different UUID.

Message: Failed to convert from type [java.lang.String] to type [org.bson.types.ObjectId] for value '2359e11c-3479-49b7-b531-cd84123ad006'; nested exception is java.lang.IllegalArgumentException: invalid hexadecimal representation of an ObjectId: [2359e11c-3479-49b7-b531-cd84123ad006] Stacktrace: org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:47) org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:191) org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174) org.springframework.data.mongodb.core.convert.MongoConverter.convertId(MongoConverter.java:146) org.springframework.data.mongodb.core.convert.QueryMapper.convertId(QueryMapper.java:629) org.springframework.data.mongodb.core.convert.QueryMapper.getMappedValue(QueryMapper.java:377) org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObjectForField(QueryMapper.java:240) org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:143) org.springframework.data.mongodb.core.QueryOperations$QueryContext.getMappedQuery(QueryOperations.java:255) org.springframework.data.mongodb.core.QueryOperations$UpdateContext.getMappedQuery(QueryOperations.java:646) org.springframework.data.mongodb.core.MongoTemplate.lambda$ org.springframework.data.mongodb.core.MongoTemplate$$Lambda$.doInCollection org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:566) org.springframework.data.mongodb.core.MongoTemplate.saveDocument(MongoTemplate.java:1485) org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1421) org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:1363) org.springframework.session.data.mongo.MongoIndexedSessionRepository.save(MongoIndexedSessionRepository.java:89) org.springframework.session.data.mongo.MongoIndexedSessionRepository.save(MongoIndexedSessionRepository.java:50) org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:225) org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$ org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryResponseWrapper.onResponseCommitted(SessionRepositoryFilter.java:179) org.springframework.session.web.http.OnCommittedResponseWrapper.doOnResponseCommitted(OnCommittedResponseWrapper.java:227) org.springframework.session.web.http.OnCommittedResponseWrapper.sendRedirect(OnCommittedResponseWrapper.java:129) javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) org.springframework.security.web.firewall.FirewalledResponse.sendRedirect(FirewalledResponse.java:43) javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) org.springframework.security.web.util.OnCommittedResponseWrapper.sendRedirect(OnCommittedResponseWrapper.java:135) javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) org.springframework.security.web.util.OnCommittedResponseWrapper.sendRedirect(OnCommittedResponseWrapper.java:135) javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) org.springframework.security.web.firewall.FirewalledResponse.sendRedirect(FirewalledResponse.java:43) javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) org.springframework.security.web.firewall.FirewalledResponse.sendRedirect(FirewalledResponse.java:43) jdk.internal.reflect.GeneratedMethodAccessor.invoke jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke java.lang.reflect.Method.invoke org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)

We are using spring-session-data-mongodb (2.3.0 RELEASE) with spring-boot-starter-data-mongodb (2.3.2 RELEASE). Spring boot 2.3.2 RELEASE with Hoxton.SR5 cloud version.

JVM version (e.g. java -version)

Java 11

akashgupta2703 avatar Mar 02 '21 14:03 akashgupta2703

Indeed, that IS an invalid hexadecimal value to try to convert into an ObjectId. The question is...where is it coming from?

A) You may wish to bump things up to Spring Boot 2.3.9. This should put you on Spring Data Neumann-SR6. Not really sure this is the problem, but it will ensure we aren't dealing with something that has already been patched.

B) Can you include a little bit of the configuration you are using? For example, are you using Jackson or JDK for serialization? I also doubt this is the issue at hand, but it can help cut the time in half about which converter I need to investigate.

gregturn avatar Mar 15 '21 13:03 gregturn

@gregturn I am using JdkMongoSessionConverter. Though it doesn't look to be needed as this is default, I have created following bean -

@Bean
public JdkMongoSessionConverter jdkMongoSessionConverter() {
	return new JdkMongoSessionConverter(serverProperties.getServlet().getSession().getTimeout());
}

Apart from above, there is no other explicit configuration.

akashgupta2703 avatar Mar 23 '21 07:03 akashgupta2703