Spring REST:如果控制器内部发生某些异常,总是得到“405 方法不允许”

Spring REST: always getting "405 method not allowed" if some exception happens inside controller

我希望控制器方法内部抛出的异常被转换为 500 内部服务器错误,但我得到 405 方法不允许客户端异常,无论控制器方法内部发生什么异常。

注意:

请求映射没有问题,因为它在我调试时进入了预期的方法。但是当控制器方法抛出异常时,我的客户端出现“405 method not allowed”

注 2:

我尝试捕获异常并使用适当的错误代码和消息抛出 HttpServerErrorException,但没有任何改变!

编辑:

我确实使用 spring 安全,这里是配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

/*

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }
*/

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/session/**").permitAll()
                .antMatchers("/app/**").permitAll()
                .antMatchers("/lib/**").permitAll()
                .antMatchers("/templates/**").permitAll()
                .antMatchers("/dial/**").permitAll()
                .antMatchers("/names/**").permitAll()
//                    .antMatchers("/workflows/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/#/login").permitAll();

        http.csrf().disable();
        http.exceptionHandling().defaultAuthenticationEntryPointFor(
                new UnauthorizedLoginUrlAuthenticationEntryPoint("/login.html"),
                new ELRequestMatcher("hasHeader('X-Requested-With','XMLHttpRequest')"));
               /* .logout()
                    .permitAll();*/
    }


}

我可以在 Spring 数据 REST 控制器的异常处理程序中找到它:-

@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class)
public class RepositoryRestExceptionHandler {

    /**
     * Send {@code 405 Method Not Allowed} and include the supported {@link org.springframework.http.HttpMethod}s in the
     * {@code Allow} header.
     *
     * @param o_O the exception to handle.
     * @return
     */
    @ExceptionHandler
    ResponseEntity<Void> handle(HttpRequestMethodNotSupportedException o_O) {

        HttpHeaders headers = new HttpHeaders();
        headers.setAllow(o_O.getSupportedHttpMethods());

        return response(HttpStatus.METHOD_NOT_ALLOWED, headers);
    }
}

你能在主 spring 引导 class 上试试这个吗(我希望你的项目 classpath 以文件夹 COM 开头):-

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"com"})

实际上问题是因为存在类型为 EmbeddedServletContainerCustomizer 的 bean。
我删除了它,问题解决了。