繁体   English   中英

Spring Boot @ExceptionHandler在开发服务器上工作,但不在本地

[英]Spring Boot @ExceptionHandler working on dev server but not locally

我知道这通常是一个相反的问题,所以在这里我有些措手不及:D

我建立了一个为用户界面提供数据的用户管理后端。 在我们的开发服务器上部署此体系结构时,一切都可以很好地工作。 但是,一旦我尝试运行集成测试(我们使用Maven货tomcat进行),或者如果我在本地tomcat中使用war文件,则根本不使用异常处理程序。 Spring仅显示标准500响应,但将异常转换为主体。

仔细阅读SO来解决类似问题只会导致我应该使用@EnableWebMVC的建议,但这既不适用于我的后端试图完成的工作,也不会改变任何东西。

我应该如何寻找该问题的解决方案? 具体来说,我可以某种方式观察是否对我的controlleradvice进行了扫描,是否有可能不这样做?

编辑:这些是相关的文件:

SpringConfiguration:

@Configuration
@ComponentScan(basePackageClasses = {UserManagementSpringConfiguration.class})
@EnableWebSecurity
public class UserManagementSpringConfiguration {

@Configuration
public static class ResourceMappingConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/ui/*/usermanagement").setViewName("forward:/usermanagement-ui/index.html");
//            registry.addViewController("/ui/*/*/generator/").setViewName("forward:/generator-ui/index.html");
        registry.addViewController("/ui/*/usermanagement/*").setViewName("forward:/usermanagement-ui/index.html");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // cache setting, otherwise fonts are not loaded in IE over https
        CacheControl cacheControl = CacheControl.noCache().mustRevalidate();
        registry.addResourceHandler("/ui/**/*").addResourceLocations("/usermanagement-ui/")
                    .setCacheControl(cacheControl);
        }

    }

}

ControllerAdvice:

@ControllerAdvice
public class CustomResponseEntityExceptionHandler {

    public static final Logger LOG = EISLoggerFactory.getLogger(CustomResponseEntityExceptionHandler.class);

    @PostConstruct
    public void postConstruct() {
        LOG.debug("CustomExceptionHandler loaded and ready for use");
    }

    @ExceptionHandler(PasswordMismatchException.class)
    public final ResponseEntity<ErrorDetails> handlePasswordChangeMismatch(
            PasswordMismatchException ex,
            WebRequest request) {
        ErrorDetails errorDetails = new ErrorDetails(
                new Date(),
                ex.getMessage(),
                request.getDescription(false),
                MessageKeys.mismatchedPassword);
        return new ResponseEntity<>(errorDetails, HttpStatus.BAD_REQUEST);
    }
}

事实证明,我们编写的模块之一以及项目中包含的模块都为Throwable.class定义了ExceptionHandler。 在我的机器上,该ControllerAdvice在我自己的ControllerAdvice之前注册,这使Spring首先在该位置查看。 由于Throwable符合要求,因此Spring不再询问其他问题,仅使用该处理程序即可。

解决我当前问题的方法是将@Order(Ordered.HIGHEST_PRECEDENCE)添加到我的ControllerAdvice中。 由于我在其中定义的异常非常具体,因此不会引起任何问题。

我的机器和开发服务器之间为什么两个ControllerAdvice类的注册顺序如此一致地为何,我还没有找到解释。 如果发现任何内容,将会更新。 现在,我认为这个问题已经得到解决。

这样的SO问题对于解决这个特定问题至关重要。 也许将来有帮助的人将其链接到这里: 设置多个@ControllerAdvice @ExceptionHandlers的优先级

感谢ValentinCarnu为我指出这一点!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM