GVKun编程网logo

Spring-data-redis @Cacheable java.lang.ClassCastException:无法将java.util.HashMap强制转换为java.lang.String

13

想了解Spring-data-redis@Cacheablejava.lang.ClassCastException:无法将java.util.HashMap强制转换为java.lang.String

想了解Spring-data-redis @Cacheable java.lang.ClassCastException:无法将java.util.HashMap强制转换为java.lang.String的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []、ClassCastException:java.math.BigInteger在连接MySQL时无法强制转换为java.lang.Long、ClassCastException:不能在连接到MySQL时将java.math.BigInteger强制转换为java.lang.Long的新知识。

本文目录一览:

Spring-data-redis @Cacheable java.lang.ClassCastException:无法将java.util.HashMap强制转换为java.lang.String

Spring-data-redis @Cacheable java.lang.ClassCastException:无法将java.util.HashMap强制转换为java.lang.String

我想用spring-data-redis在spring
boot应用程序中缓存数据。但是它总是说强制转换异常。我用了一段时间搜索但没有任何想法。请帮帮我。谢谢,任何建议都很棒!

这是我的RedisConfiguation:

@Configuration@EnableCachingpublic class RedisConfiguration extends CachingConfigurerSupport {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private String port;@Value("${spring.redis.expire}")private String expire;@Value("${spring.redis.database}")private String databaseIndex;@Value("${spring.redis.password}")private String password;@Beanpublic KeyGenerator keyGenerator() {    return new KeyGenerator() {        public Object generate(Object target, Method method, Object... params) {            if (params.length == 0) {                return "reids_" + method.getName();            }            if (params.length == 1) {                Object param = params[0];                if (param != null && !param.getClass().isArray()) {                    return "reids_" + method.getName() + "_" + param;                }            }            return "reids_" + method.getName() + " [" + StringUtils.arrayToCommaDelimitedString(params) + "]";        }    };}@Beanpublic CacheManager cacheManager(RedisTemplate redisTemplate) {    RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);    redisCacheManager.setDefaultExpiration(Integer.parseInt(expire));    redisTemplate.setHashValueSerializer(new StringRedisSerializer());    redisTemplate.setKeySerializer(new StringRedisSerializer());    redisTemplate.setValueSerializer(new StringRedisSerializer());    redisTemplate.setHashKeySerializer(new StringRedisSerializer());    return redisCacheManager;}@Bean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();    redisTemplate.setConnectionFactory(factory);    redisTemplate.setValueSerializer(new RedisSerializer<Object>() {        @Override        public byte[] serialize(Object object) throws SerializationException {            if (object == null) {                return new byte[0];            }            if (!(object instanceof Serializable)) {                throw new IllegalArgumentException("RedisSerializer.serialize requires a Serializable payload "                        + "but received an object of type [" + object.getClass().getName() + "]");            }            return SerializationUtils.serialize((Serializable) object);        }        @Override        public Object deserialize(byte[] bytes) throws SerializationException {            if (bytes == null || bytes.length == 0) {                return null;            }            return SerializationUtils.deserialize(bytes);        }    });    redisTemplate.afterPropertiesSet();    return redisTemplate;}@Beanpublic JedisConnectionFactory redisConnectionFactory() {    JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();    // Defaults    redisConnectionFactory.setHostName(host);    redisConnectionFactory.setPort(Integer.parseInt(port));    redisConnectionFactory.setDatabase(Integer.parseInt(databaseIndex));    redisConnectionFactory.setPassword(password);    return redisConnectionFactory;}}

我在Controller中使用它:

@Cacheable(value = "helloRedisCache",keyGenerator = "keyGenerator")@RequestMapping(value = "/Discovery/redisCache", method = RequestMethod.GET)public Map helloRedisCache() {    return new HashMap();}

我有例外:

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Stringat org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:32) ~[spring-data-redis-1.7.3.RELEASE.jar:na]at org.springframework.data.redis.cache.RedisCache$CacheValueAccessor.convertToBytesIfNecessary(RedisCache.java:375) ~[spring-data-redis-1.7.3.RELEASE.jar:na]at org.springframework.data.redis.cache.RedisCache$BinaryRedisCacheElement.<init>(RedisCache.java:408) ~[spring-data-redis-1.7.3.RELEASE.jar:na]at org.springframework.data.redis.cache.RedisCache.put(RedisCache.java:173) ~[spring-data-redis-1.7.3.RELEASE.jar:na]at org.springframework.data.redis.cache.RedisCache.put(RedisCache.java:157) ~[spring-data-redis-1.7.3.RELEASE.jar:na]at org.springframework.cache.interceptor.AbstractCacheInvoker.doPut(AbstractCacheInvoker.java:85) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:780) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:428) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:327) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-4.3.3.RELEASE.jar:4.3.3.RELEASE]at com.senthink.www.rest.DiscoveryRestController$$EnhancerBySpringCGLIB$$df010633.helloRedisCache(<generated>) ~[na:na]at sun.reflect.GeneratedMethodAccessor539.invoke(Unknown Source) ~[na:na]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) ~[na:1.8.0_101]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at com.senthink.www.filter.MyCORSFilter.doFilter(MyCORSFilter.java:37) ~[classes/:na]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:105) ~[spring-boot-actuator-1.4.1.RELEASE.jar:1.4.1.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at com.senthink.www.security.JwtAuthenticationTokenFilter.doFilterInternal(JwtAuthenticationTokenFilter.java:74) ~[classes/:na]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) ~[spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:107) ~[spring-boot-actuator-1.4.1.RELEASE.jar:1.4.1.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar:8.5.5]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar:8.5.5]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar:8.5.5]at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]

答案1

小编典典

当存储哈希对象时,redis将与Jackson2JsonRedisSerializer一起使用,可用于绑定到类型化的bean或未类型化的实例。

redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

错误堆栈:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
    at android.support.v4.util.SimpleArrayMap.allocArrays(SourceFile:183)
    at android.support.v4.util.SimpleArrayMap.put(SourceFile:437)

错误原因:
由于SimpleArrayMap 里面使用了一个静态变量的缓存,mBaseCache,

    static Object[] mBaseCache;

该变量默认有两个数据,第1个元素是一个object[],用于存放上次的缓存的mBaseCache
第二个元素是int[],用于存在hash。具体赋值代码可以看下面

synchronized (ArrayMap.class) {
                if (mBaseCacheSize < CACHE_SIZE) {
                    array[0] = mBaseCache;
                    array[1] = hashes;
                    for (int i=(size<<1)-1; i>=2; i--) {
                        array[i] = null;
                    }
                    mBaseCache = array;
                    mBaseCacheSize++;
                    if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
                            + " now have " + mBaseCacheSize + " entries");
                }
            }

使用该数组的地方在:
SimpleArrayMap 的allocArrays 方法里

synchronized (ArrayMap.class) {
                if (mBaseCache != null) {
                    final Object[] array = mBaseCache;
                    mArray = array;
                    mBaseCache = (Object[])array[0];
                    mHashes = (int[])array[1];
                    array[0] = array[1] = null;
                    mBaseCacheSize--;
                    if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
                            + " now have " + mBaseCacheSize + " entries");
                    return;
                }
            }

下面这段代码是有风险的,如果mBaseCache 在多线程被修改了,就会把ClassCastException 异常。

        mBaseCache = (Object[])array[0];

解决方法:
如果项目某个地方报这个错误,请把这个地方的ArrayMap替换成 HasMap. HasMap 多线程不会崩溃,虽然,他不是特别完好的支持。不需要把项目中所有的地方都替换掉,没有必要。单独线程,ArrayMap 完全没有问题。

错误复现:这个复现起来超级麻烦,我花了一周的时间,才找到复现的漏洞,分享给大家:

    /**
     * 复现该问题  用了四个线程
     *     java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
     *         at android.support.v4.util.SimpleArrayMap.allocArrays(SimpleArrayMap.java:157)
     *         at android.support.v4.util.SimpleArrayMap.put(SimpleArrayMap.java:399)
     *         at com.example.fragment.MainFragment$14.run(MainFragment.java:280)
     *        1.首先 线程1 执行到put 方法的

     *         mArray[index<<1] = key;
     *         mArray[(index<<1)+1] = value;
     *         mSize++;
     *         return null;
     *         最上面这个位置  目的是让这个数组不再是空的
     *
     *         2.执行线程2  也执行到
     *         mArray[index<<1] = key;
     *         mArray[(index<<1)+1] = value;
     *         mSize++;
     *         return null;
     *         最上面这个位置  目的是让这个put 的东西,放在第0个位置,因为put里面会生成index,
     *         让两个线程都放到index 是0 的位置
     *
     *         3.把线程1执行完,这样数据里面已经放进去一个数据了
     *
     *         4.执行线程3 到removeAt 方法的 freeArrays 的  mBaseCache = array; 之前
     *             public V removeAt(int index) {
     *              final Object old = mArray[(index << 1) + 1];
     *              if (mSize <= 1) {
     *             // Now empty.
     *             if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
     *             freeArrays(mHashes, mArray, mSize);
     *
     *             mBaseCache = array;----------- freeArrays
     *
     *             这个的目的是调用freeArray 方法,让当前的map释放当前的数组。这样就可以生成mBaseCache了
     *
 *             5.把线程2  执行完
 *             这样就会把mBaseCache 赋值的数组,重新赋值
 *
 *             6.把线程3执行完
 *             ok,现在mBaseCache已经被污染了
 *
 *             7.执行线程4
 *
 */
    private void CMETestCastException() {
        final ArrayMap testArrayMap = new ArrayMap();
        final ArrayMap testArrayMap2 = new ArrayMap();

        new  Thread("线程1"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.put("2324","fffff");
            }

        }.start();

        new  Thread("线程2"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.put("test","string");
            }

        }.start();

        new  Thread("线程3"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.removeAt(0);
            }

        }.start();

        new  Thread("线程4"){
            @Override
            public void run() {
                super.run();
                    testArrayMap2.put("aaa","string");
            }

        }.start();
    }

复现这个问题的时候,关键是把mBaseCache 污染掉。这里四个线程的话,需要调试,调试步骤就是上面我注释的。

总结:
如果当前的map 会有多个线程访问,请使用HasMap. 该问题,google 并没有解决。在高版本上,直接扔CME ConcurrentModificationException.

AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []

AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []

在我的应用程序中,我为gcm ccs(xmpp)运行这些代码,并且代码显示以下错误执行时发生错误doinbackground.excute()
这是代码:

sendTask = new AsyncTask<String, String, String>() {    protected String doInBackground(String... title) {        Bundle data = new Bundle();        data.putString("ACTION", action);        data.putString("CLIENT_MESSAGE", "Hello GCM CCS XMPP!");        String id = Integer.toString(ccsMsgId.incrementAndGet());        try {            Log.d("RegisterActivity", "messageid: " + id);            gcm.send(SENDER_ID + "@gcm.googleapis.com", id,                     data);            Log.d("RegisterActivity", "After gcm.send successful.");        } catch (IOException e) {            Log.d("RegisterActivity", "Exception: " + e);            e.printStackTrace();        }        return "Sent message.";    }    protected void onPostExecute(String result) {        sendTask = null;        // tosat about the success in return    }};sendTask.execute(null, null, null);

答案1

小编典典

您如何sendTask申报?我想它是简单的AsyncTask sendTask;,如果是这样,请将其更改为:

AsyncTask<String, String, String> sendTask;

此异常的原因与以下代码中发生的原因类似:

Object arr1[] = new Object[] {null,null,null};String arr2[] = (String[])arr1; // here java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Java中的VarArgs是作为数组实现的,因此,当您AsyncTask<String, String,String>将sendTask声明为as时,编译器将doInBackground使用with进行调用newString[]{null,null,null},但是当您将AsyncTaskthen 声明为then
时,则将doInBackground使用with进行调用new Object[]{null,null,null}

由于类型擦除,编译器将添加隐藏的隐式强制类型从Object[]String[]。这是为了允许以下代码正常工作:

  AsyncTask sendTask = ...;  Object[] arg = new String[]{null,null,null};  sendTask.execute(arg);

ClassCastException:java.math.BigInteger在连接MySQL时无法强制转换为java.lang.Long

ClassCastException:java.math.BigInteger在连接MySQL时无法强制转换为java.lang.Long

连接到MySQL时,出现错误(见下文).

单击here以获取代码

我得到这个输出:

run:
Now connecting to databse...

java.sql.sqlException: java.lang.classCastException: java.math.BigInteger cannot be cast to java.lang.Long
java.sql.sqlException: java.lang.classCastException: java.math.BigInteger cannot be cast to java.lang.Long
    at com.@R_301_5163@.jdbc.sqlError.createsqlException(sqlError.java:1074)
    at com.@R_301_5163@.jdbc.sqlError.createsqlException(sqlError.java:988)
    at com.@R_301_5163@.jdbc.sqlError.createsqlException(sqlError.java:974)
    at com.@R_301_5163@.jdbc.sqlError.createsqlException(sqlError.java:919)
    at com.@R_301_5163@.jdbc.ConnectionImpl.buildCollationMapping(ConnectionImpl.java:1062)
    at com.@R_301_5163@.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3556)
    at com.@R_301_5163@.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2513)
    at com.@R_301_5163@.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
    at com.@R_301_5163@.jdbc.ConnectionImpl.301_5163@.jdbc.JDBC4Connection.java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.@R_301_5163@.jdbc.Util.handleNewInstance(Util.java:411)
    at com.@R_301_5163@.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
    at com.@R_301_5163@.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at dbms_basic.Dbms_Basic.main(Dbms_Basic.java:28)
Caused by: java.lang.classCastException: java.math.BigInteger cannot be cast to java.lang.Long
    at com.@R_301_5163@.jdbc.ConnectionImpl.buildCollationMapping(ConnectionImpl.java:1007)
    ... 15 more
BUILD SUCCESSFUL (total time: 0 seconds)

我怎么解决这个问题?

最佳答案
您的错误清楚地表明无法进行转换,因为java.math.BigInteger类实例不是java.lang.Long类的实例.

现在出现的问题是谁在什么级别进行转换,当我们要求JDBC驱动程序建立连接时,它在场景之后做了很多工作,然后才真正给我们提供了正确的连接工作对象.

您的@R_301_5163@版本与您的mysql-connector.jar版本相结合似乎存在问题.尝试使用较新版本的@R_301_5163@ Connector / J(有关最新版本,请参阅https://dev.mysql.com/downloads/connector/j/),例如,如果您使用的是旧版本,请升级到5.1.47或8.0.12.

ClassCastException:不能在连接到MySQL时将java.math.BigInteger强制转换为java.lang.Long

ClassCastException:不能在连接到MySQL时将java.math.BigInteger强制转换为java.lang.Long

连接到MySQL时,出现错误(见下文)。

点击此处获取代码

我得到以下输出:

run:Now connecting to databse...java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Longjava.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)    at com.mysql.jdbc.ConnectionImpl.buildCollationMapping(ConnectionImpl.java:1062)    at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3556)    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2513)    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)    at java.sql.DriverManager.getConnection(DriverManager.java:664)    at java.sql.DriverManager.getConnection(DriverManager.java:247)    at dbms_basic.Dbms_Basic.main(Dbms_Basic.java:28)Caused by: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long    at com.mysql.jdbc.ConnectionImpl.buildCollationMapping(ConnectionImpl.java:1007)    ... 15 moreBUILD SUCCESSFUL (total time: 0 seconds)

我该如何解决?

答案1

小编典典

您的错误明确指出无法进行强制转换,因为java.math.BigInteger类实例不是java.lang.Long类的实例。

现在出现了一个问题,即谁在哪个级别上进行强制转换,当我们要求JDBC驱动程序进行连接时,它实际上在幕后进行了大量工作,然后才真正给我们适当的连接工作对象。

您的MySQL版本与mysql-connector.jar版本组合似乎出现了问题。尝试使用更高版本的MySQL Connector /
J(有关最新版本,请参见https://dev.mysql.com/downloads/connector/j/),例如,如果使用的是旧版本,请升级到5.1.47或8.0.12版。

关于Spring-data-redis @Cacheable java.lang.ClassCastException:无法将java.util.HashMap强制转换为java.lang.String的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、AsyncTask:ClassCastException:java.lang.Object []无法转换为java.lang.String []、ClassCastException:java.math.BigInteger在连接MySQL时无法强制转换为java.lang.Long、ClassCastException:不能在连接到MySQL时将java.math.BigInteger强制转换为java.lang.Long等相关内容,可以在本站寻找。

本文标签: