Spring MVC не может загрузить CSS, получая ошибку 405 - PullRequest
0 голосов
/ 03 июля 2019

Я создаю приложение Spring Boot MVC, используя Thymeleaf, и у меня возникают проблемы с загрузкой статического содержимого, такого как CSS, на страницу.

Всякий раз, когда я пытаюсь загрузить файл css в шаблон, запрос завершается ошибкой с кодом ошибки 405 Request method 'GET' not supported. Я пробовал несколько разных способов ссылки на файл CSS, например

<link href="/css/style.css}" rel="stylesheet" type="text/css"/>
<link href="../static/css/style.css}" rel="stylesheet" type="text/css"/>
<link href="/static/css/style.css}" rel="stylesheet" type="text/css"/>
<link th:href="@{/static/css/style.css}" rel="stylesheet" type="text/css"/>

в основном все возможные комбинации всех предыдущих, все еще получая ту же ошибку.

Моя файловая структура выглядит так:

└── src
    └── main
        ├── java
        │   └── cz
        │       └── company
        │           └── nps
        │               ├── NpsApplication.java
        │               ├── WebConfig.java
        │               └── controller
        │                   └── SurveyController.java
        └── resources
            ├── application.properties
            ├── messages.properties
            ├── messages_CZ.properties
            ├── messages_EN.properties
            ├── static
            │   ├── css
            │   │   └── style.css
            │   ├── img
            │   │   └── favicon.ico
            │   └── js
            └── templates
                ├── footer.html
                ├── header.html
                └── survey.html

WebCofig.java:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }

    @Bean
    public LocaleResolver localeResolver()
    {
        final SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(new Locale("cs", "CZ"));
        return localeResolver;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

Что я делаю не так? По всем материалам, которые я нашел, это должно работать без проблем.

Редактировать 1: build.gradle:

plugins {
    id 'org.springframework.boot' version '2.1.5.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'cz.company'
sourceCompatibility = '11'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.webjars:bootstrap:3.3.7'
    implementation 'dom4j:dom4j:1.6.1'

    implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
    implementation 'javax.jws:javax.jws-api:1.1'
    implementation 'javax.xml.ws:jaxws-api:2.3.1'

    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Поскольку вы используете аннотации, добавьте это в ваш класс WebConfig:

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
        "classpath:/META-INF/resources/", "classpath:/resources/",
        "classpath:/static/", "classpath:/public/" };

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**")
        .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
}

Это должно создать отображения, необходимые вашему приложению для получения файлов ресурсов (измените расположение ресурсов в соответствии с вашими потребностями).

0 голосов
/ 03 июля 2019

Хорошо, в контроллере произошла действительно глупая ошибка.

Исходный класс контроллера выглядел так:

@Controller
public class SurveyController {

    @GetMapping("/nps")
    public String getSurvey() {
        return "survey";
    }

    // TODO
    @PostMapping
    public String postSurvey() {
        return "";
    }
}

Обратите внимание, что я забыл добавить имя к аннотации @PostMapping. Это кажется причиной проблемы. Когда я изменил его на @PostMapping("/nps"), все стало работать нормально.

На всякий случай, если это кому-нибудь поможет, я использую <link href="/css/style.css" rel="stylesheet" type="text/css" /> для ссылки на таблицу стилей.

0 голосов
/ 03 июля 2019

Это должно работать для вас: -

<link rel="stylesheet" type="text/css" th:href="@{/static/css/style.css}" />

Обновление 1: - Было ли в вашем файле web.xml отображение сервлетов для js и CSS? Проверьте эти строки. Если его нет, добавьте его и, пожалуйста, проверьте еще раз.

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.js</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
</servlet-mapping>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...