Страница ошибки Whitelabel Error: Произошла непредвиденная ошибка (тип = Не найдено, статус = 404) при запросе с сопоставлением уровня 1 - PullRequest
0 голосов
/ 08 ноября 2019

Столкнулся с крайне неоднозначной и непонятной проблемой на мой взгляд. У меня есть приложение на Spring Boot + Kotlin. Ранее в приложении были исключения для контроллеров Rest;В последнее время возникла необходимость давать html в ответах, поэтому добавили обычный контроллер. Однако при отображении этого контроллера на более чем 1 уровень - все запросы (с более чем 1 уровнем) вызывают ошибку:

<html>
<body>
<h1> Whitelabel Error Page </h1>
<p> This application has no explicit mapping for / error, so you are seeing this as a fallback. </p>
<div> There was an unexpected error (type = Not Found, status = 404). </div>
<div> No message available </div>
</body>
</html>

Более того, запросы на 1-м уровне работают правильно.

Совершенно непонятно, с чем это связано. Большое количество попыток исправить это (ничего не помогло), но могло что-то пропустить.

Я применяю настройки, с которыми связываю возможные проблемы (если вдруг кто-то пытается помочь, а что-то еще нужно - скажите мне,Я добавлю эту информацию)

Контроллер

@Controller
@RequestMapping("/welcome")
class WelcomeEndpoint {

    @GetMapping
    fun welcome(): String {
        return "index.html"
    }

    @GetMapping("/welcome")
    fun signIn(): String {
        return "index.html"
    }
}

WebMvcConfig

@Configuration
@EnableWebMvc
class WebMvcConfig : WebMvcConfigurer {

    private final val classpathResourceLocations = arrayOf(
            "classpath:/META-INF/resources/",
            "classpath:/resources/",
            "classpath:/static/",
            "classpath:/public/"
    )

    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        if (!registry.hasMappingForPattern("/**")) {
            registry.addResourceHandler("/**")
                    .addResourceLocations(*classpathResourceLocations)
        }
    }

    override fun addViewControllers(registry: ViewControllerRegistry) {
        registry.addViewController("/").setViewName("index.html")
    }

    @Bean
    fun internalResourceViewResolver(): ViewResolver {
        val viewResolver = InternalResourceViewResolver()
        viewResolver.setViewClass(InternalResourceView::class.java)
        return viewResolver
    }

}

WebSecurityConfig

@Configuration
@EnableWebSecurity
class CommonSecurityConfig : WebSecurityConfigurerAdapter() {

    private val permitPatterns = arrayOf(
            "/",
            "/welcome/**",
            "/resources/**",
            "/actuator/health**",
            "/swagger-resources/**",
            "/swagger-ui.html",
            "/v2/api-docs",
            "/webjars/**"
    )

    override fun configure(http: HttpSecurity) {
        super.configure(http)

        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .cors().configurationSource(corsConfigurationSource())
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers(*permitPatterns).permitAll()
                .antMatchers("/api/internal/**").hasAuthority("ADMIN")
                .anyRequest().authenticated()
                .and()
                .addFilterAfter(filter(), UsernamePasswordAuthenticationFilter::class.java)
    }

    // ... some logic after ...
}

Таким образом, если я выполню запрос по пути http://localhost:8080/welcome, я получу страницу index.html Если я выполню запрос по пути http://localhost:8080/welcome/welcome - я получаю ошибку выше

Файл index.html находится по пути src/main/resources/static/index.html

1 Ответ

1 голос
/ 08 ноября 2019

Это связано с тем, как Spring разрешает вашу статическую страницу.
Поскольку "/welcome/welcome" является вложенным, вам нужно будет использовать правильный относительный путь к вашему ресурсу или абсолютный путь.

@Controller
@RequestMapping("/welcome")
class WelcomeEndpoint {

    @GetMapping("/welcome")
    fun signIn(): String {
        return "../index.html"
    }
}

ИЛИ

@Controller
@RequestMapping("/welcome")
class WelcomeEndpoint {

    @GetMapping("/welcome")
    fun signIn(): String {
        return "/index.html"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...