Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler d

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

最根本的原因我还不太清楚,可能是错综复杂的bug

因此,展示我因为这个bug所进行的一些改动

先说明一下,我一开始打算将以下代码抽取成一个方法。

/**
     * 根据id查询病患信息
     * @param id
     * @return
     */
    @Override
    public Result<Patient> getById1(Long id) {
        //Patient patient = cacheClient.queryWithPAssThrough(RedisConstants.CACHE_PATIENT_KEY,id,Patient.class,this::getById,RedisConstants.CACHE_PATIENT_TTL, TimeUnit.MINUTES);
//        Patient patient = patientMapper.getById(id);
//        return patient;
        String key = RedisConstants.CACHE_PATIENT_KEY + id;
        //1.从redis查询缓存
        String json = stringRedisTemplate.opsForValue().get(key);
        //2.判断是否存在
        if (StrUtil.isNotBlank(json)) {
            //3.存在,直接返回
            Patient patient = JSONUtil.toBean(json, Patient.class);
            return Result.success(patient);
        }
        //判断命中的是否是空值
        if (json != null) {
            //返回一个错误信息
            return null;
        }
        //4.不存在,根据id查询数据库
        Patient patient = patientMapper.getById(id);
        //5.不存在,返回错误
        if(patient == null){
            //将空值写入redis
            stringRedisTemplate.opsForValue().set(key,"", RedisConstants.CACHE_NULL_TTL,TimeUnit.MINUTES);
            //返回错误信息
            return null;
        }
        //6.存在,写入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(patient),RedisConstants.CACHE_NULL_TTL,TimeUnit.MINUTES);
        return Result.success(patient);
    }

 以下方法。

package com.sky.service;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import com.sky.utils.RedisConstants;
import com.sky.utils.RedisData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

@Slf4j
@Component
public class CacheClient {
   @Resource
    private StringRedisTemplate stringRedisTemplate;

    public void set(String key, Object value, Long time, TimeUnit unit){
        stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(value),time,unit);
    }
    public void setWithLogicalExpire(String key,Object value,Long time,TimeUnit unit){
        //设置逻辑过期
        RedisData redisData = new RedisData();
        redisData.setData(value);
        redisData.setExpireTime(LocalDateTime.now().plusSeconds(unit.toSeconds(time)));
        //写入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(redisData));
    }
    public <R,ID> R queryWithPAssThrough
            (String keyPrefix, ID id, Class<R> type, Function<ID, R> dbFallback, Long time, TimeUnit unit) {
        String key = keyPrefix + id;
        //1.从redis查询缓存
        String json = stringRedisTemplate.opsForValue().get(key);
        //2.判断是否存在
        if (StrUtil.isNotBlank(json)) {
            //3.存在,直接返回
            return JSONUtil.toBean(json, type);
        }
        //判断命中的是否是空值
        if (json != null) {
            //返回一个错误信息
            return null;
        }
        //4.不存在,根据id查询数据库
        R r = dbFallback.apply(id);
        //5.不存在,返回错误
        if(r == null){
            //将空值写入redis
            stringRedisTemplate.opsForValue().set(key,"", RedisConstants.CACHE_NULL_TTL,TimeUnit.MINUTES);
            //返回错误信息
            return null;
        }
        //6.存在,写入redis
        this.set(key,r,time,unit);
        return r;
    }
}

 于是就出现了这个bug

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

1.循环注入问题

可能是我的代码太乱了出现的。

2.导包导错了,我猜这个是最重要的。以下是手动代码的,不是idea那些自带的。但是自从我尝试用mybatisplus之后,他就莫名奇怪给我弄了一个一模一样的result

而为了避免用那个奇奇怪怪的代码,idea就给了我一些方法

 

 1.在Result前添加com.sky.result,准确说明这个Result是谁的Result

2.以防万一,将getById改为getById1,避免奇奇怪怪的事情发生。


记录一下! 

 

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误信息表示在 Servlet [dispatcherservlet] 中调用 servlet.service() 方法时发生了异常,导致处理程序调度失败。根本原因是 Java.lang.StackOverflowError 错误。 ### 回答2: 这个异常是指在处理请求时,出现了一个致命错误。具体来说,是在处理一个名为“Dispatcherservlet”的Servlet时发生的,该Servlet所属的应用程序上下文是空字符串。在执行处理程序时,发生了一个堆栈溢出错误,这是由于程序递归调用同一个方法或函数时导致的。 在处理HTTP请求时,Servlet容器会根据请求中的URL选择要执行的Servlet。对于每个Servlet,容器都会调用其service()方法来处理请求。这个异常表示在处理请求时,Dispatcherservletservice()方法递归调用自身,导致堆栈溢出并将整个应用程序崩溃。通常情况下,这种情况是由于出现无限循环调用或递归调用的情况导致的。 为了解决这个问题,我们需要检查Dispatcherservlet代码并查找导致递归调用的部分。通常情况下,这是由于处理请求的方法中的某些逻辑错误导致的,例如无限循环调用导致程序死循环。 一种解决方法是在Dispatcherservlet代码中添加调试日志,以便在发生异常时能更好地跟踪问题。另一个解决方法是使用调试工具来跟踪应用程序的执行路径,并确定递归调用发生的具体位置。 在实际项目中,为了避免这种情况的发生,我们应该注意编写正确的代码,确保程序不会发生无限循环或递归调用的情况。此外,应该定期进行代码审查和测试,及时发现和解决潜在的问题,确保应用程序的稳定性和可靠性。 ### 回答3: 该异常通常是由于在处理HTTP请求时出现了无限递归的情况,导致栈溢出并最终引发了java.lang.stackoverflowerror异常。 这个异常多发生在使用Spring MVC框架或者其他MVC框架的时候,有可能是controller中注入了太多的依赖或方法互相调用时产生了无限递归,也可能是在使用自定义过滤器或者拦截器时配置错误导致死循环。 针对这个异常,可以采用以下几种方式进行处理: 1.检查代码 首先需要仔细检查代码,找出哪些方法或依赖存在递归调用的情况。如果存在可以尝试调整代码逻辑,避免递归调用。 2.减少依赖注入 如果代码中存在过多的依赖注入,可以尝试减少依赖注入的数量或者将依赖注入拆分成多个类,在需要时再进行调用。 3.调整配置 在使用自定义过滤器或者拦截器时,需要仔细检查配置文件,确保配置正确并不会导致死循环。如果有问题可以进行调整或者删除相关配置。 4.增加栈大小 如果以上方法无法解决问题,可以尝试增加JVM栈大小来解决问题。可以通过修改JVM启动参数"-Xss"来实现。例如增加到1m:-Xss1m 总之,需要仔细分析和排查可能引起这个异常的问题,逐步解决问题,确保应用程序正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值