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。
我删除了它,问题解决了。
我希望控制器方法内部抛出的异常被转换为 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。
我删除了它,问题解决了。