【问题标题】:Spring boot Handler dispatch failed; nested exception is java.lang.StackOverflowError when calling a service more than once in a rest controllerSpring boot Handler 调度失败;在休息控制器中多次调用服务时,嵌套异常是 java.lang.StackOverflowError
【发布时间】:2022-10-05 18:22:55
【问题描述】:

我正在使用带有 java 11 的 spring boot 2.2.4。

当我在 Spring Boot 应用程序的休息控制器中多次使用服务时,它会在控制台中打印太多警告并最终抛出异常:

WARN 21740 --- [nio-8080-exec-4] o.h.e.loading.internal.LoadContexts      : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@70823236<rs=HikariProxyResultSet@1665630462 wrapping Result set representing update count of 4>
WARN 21740 --- [nio-8080-exec-4] o.h.e.loading.internal.LoadContexts      : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@3acd228<rs=HikariProxyResultSet@368473467 wrapping Result set representing update count of 4>
ERROR 21740 --- [nio-8080-exec-4] i.m.ExceptionHandling  : Handler dispatch failed; nested exception is java.lang.StackOverflowError

这是其余控制器类的一部分:

@CrossOrigin
@RestController
@RequestMapping(\"/api/purchase\")
public class PurchaseController {

    private PurchaseService purchaseService;
    
    public PurchaseController(PurchaseService purchaseService) {
        this.purchaseService = purchaseService;
    }

    @PostMapping(\"/create-order\")
    public ResponseEntity<PurchaseResponse> createOrder() {
        Order order = purchaseService.createOrder(); // first use of service (its ok)
        String simple = purchaseService.simple(); // second use of service : this will cause the exception

        PurchaseResponse purchaseResponse = new PurchaseResponse(<some argument>);
        return new ResponseEntity<>(purchaseResponse,OK);
    }

    ...

}

这是服务类的一部分:

@Service
@Transactional
@Qualifier(\"purchaseService\")
public class PurchaseServiceImpl implements PurchaseService {

    private OrderRepository orderRepository;

    @Autowired
    public PurchaseServiceImpl(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    @Override
    public Order createOrder() {
        ...
        return new Order();
    }
    
    public String simple(){
        return \"simple called !\";
    }
    
    ...
    
}

请注意 simple() 方法的主体根本不重要,使用任何方法都会导致异常。

提前致谢

  • 它似乎不是 Spring Boot 的问题,但使用“简单方法”的逻辑,如果它仍然抛出错误,你可以尝试只从休息端点调用简单方法,你有孤立的问题,否则会发生一些可疑的事情在您的创建和简单 - 准确问题识别需要更多详细信息 - 带有警告日志,看起来您的实体映射不正确
  • 只是猜测simple 方法只存在于实现中,而在接口PurchaseService 中不可用。如果是这种情况,请尝试在接口中添加simple 方法。

标签: java spring-boot rest post service


【解决方案1】:

最后,我发现问题与 purchaseService.createOrder() 方法的逻辑有关,并且是因为一对多的关系懒惰地工作。更改获取类型和其他一些更改,解决了问题,它与在休息控制器中使用服务的次数完全无关!

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2017-10-20
    • 2019-02-01
    • 2020-09-01
    • 2021-10-06
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多