Spring REST: всегда не разрешен метод 405, если внутри контроллера происходит какое-то исключение

Я ожидаю, что исключения, созданные внутри методов контроллера, будут преобразованы в внутреннюю ошибку сервера 500, но я получаю исключение метод 405 не разрешен на стороне клиента, независимо от того, какие исключения возникают внутри метод контроллера.

ПРИМЕЧАНИЕ:

В сопоставлении запросов нет ничего плохого, поскольку при отладке он переходит к ожидаемому методу. Но когда исключение выбрасывается из методов контроллера, я получаю метод 405, запрещенный в моем клиенте.

ЗАМЕТКА 2:

Я пробовал перехватывать исключения и выдавать HttpServerErrorException с соответствующим кодом ошибки и сообщением, но ничего не изменилось!

РЕДАКТИРОВАТЬ:

Я использую Spring Security, и вот конфигурация:

@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();*/
    }


}

person Alireza Mirian    schedule 20.09.2015    source источник
comment
Можете ли вы поделиться своим методом вместе с URL-адресом запроса PUT, который вы используете !!! Вы тоже используете весеннюю безопасность ?? если да, то конфигурация безопасности, которую вы используете, также полезна.   -  person Avis    schedule 20.09.2015
comment
Есть совет по исключению, отображающий exception на 405? Можете ли вы привести простой пример, который воспроизводит это поведение?   -  person Bruno César    schedule 20.09.2015
comment
@Avis Я использую весеннюю безопасность. Добавил свой конфиг в пост. Я уверен, что дело не в отображении URL. Однако я подозреваю, что происходит какая-то фильтрация исключений, и я понятия не имею, откуда она взялась. может там что-то с весенней безопасностью.   -  person Alireza Mirian    schedule 20.09.2015


Ответы (2)


Я мог найти это в обработчике исключений для контроллера Spring Data 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);
    }
}

Можете ли вы попробовать это в своем основном весеннем загрузочном классе (надеюсь, ваш путь к классу проекта начинается с папки COM): -

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"com"})
person Avis    schedule 20.09.2015

На самом деле проблема была из-за существования бина типа EmbeddedServletContainerCustomizer.
Я удалил его и проблема решилась.

person Alireza Mirian    schedule 22.09.2015