gpt4 book ai didi

java - 使用Spring @ControllerAdvice的全局错误处理程序不起作用

转载 作者:行者123 更新时间:2023-12-03 08:57:22 24 4
gpt4 key购买 nike

有人知道为什么以下代码未能捕获异常吗?

package org.rythmengine.spring.web.servlet.view;

import org.rythmengine.RythmEngine;
import org.rythmengine.exception.RythmException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class RythmExceptionHandler {

RythmEngine engine;

@Autowired
public RythmExceptionHandler(RythmConfigurer conf) {
this.engine = conf.getRythmEngine();
}

@ExceptionHandler(value = RythmException.class)
public ModelAndView defaultErrorHandler(RythmException e) throws Exception {
if (engine.mode().isProd()) {
throw e;
}
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.setViewName("errors/500.html");
return mav;
}

}

最佳答案

找到了问题。它需要在配置文件中添加一行:

<context:component-scan base-package="org.rythmengine.spring.web.servlet.view"/>

并且除了 @EnableWebMvc批注之外,还需要添加 @ControllerAdvice批注。

但是,我不能强制用户在其配置中添加组件,或者我想使其对用户透明。因此,解决方案变为以下代码:
    if (engine.isDevMode()) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("org.rythmengine.spring.web.servlet.view");
}

到目前为止,这还没有结束。它成功捕获了用户 Controller 代码中的Exception,但未成功捕获 View 呈现过程中的异常。我正在寻找一种添加 HandlerInterceptor的方法,以便它可以处理 DispatcherServlet.triggerAfterCompletion(...)中的错误

更新

上面的代码证明不起作用。最终的解决方案是将以下注释添加到任意类中:
@Configuration
@ComponentScan("org.rythmengine.spring.web.servlet.view")

是的,现在我不需要用户将 <context:component-scan ...>添加到他们的xml配置文件中。

关于渲染时间异常处理,如果在 RythmView调用中出现错误(通常是编译错误或解析错误),我会在 checkResource(Locale)类中内部缓存该异常,在以下 renderMergedTemplateModel调用中,我将检查是否存在缓存的异常,如果有,则呈现异常屏幕,如下所示:

是的,仅当您将 RythmConfigurer的devMode设置为true(默认为false)时,开发人员友好的屏幕功能才可用:
<bean id="rythmConfig" class="org.rythmengine.spring.web.servlet.view.RythmConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/rythm/"/>
<property name="outputRequestParameters" value="false"/>
<property name="devMode" value="true"/>
</bean>

关于java - 使用Spring @ControllerAdvice的全局错误处理程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20366992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com