【问题标题】:Spring MVC can't load CSS, getting error 405Spring MVC 无法加载 CSS,出现错误 405
【发布时间】:2019-11-13 23:54:40
【问题描述】:

我正在使用 Thymeleaf 构建 Spring Boot MVC 应用程序,但在将静态内容(例如 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'
}

【问题讨论】:

    标签: css spring-boot spring-mvc bootstrap-4 thymeleaf


    【解决方案1】:

    这应该适合你:-

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

    更新 1:- 您的 web.xml 中是否有用于 js 和 CSS 的 Servlet 映射? 检查这些行。如果不存在,请添加并再次检查。

    <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>
    

    【讨论】:

    • 这行不通,很遗憾。对http://localhost:8080/static/css/style.css 的请求失败,错误代码为 405,这会记录在控制台中:DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]
    • @Update 1:我没有任何 web.xml 文件。有必要吗?我找到了多个项目结构并决定使用我当前的项目结构,它不包含任何 XML 配置和 web-inf 文件夹。
    • @fugasjunior 这不是因为您正在为您的配置使用注释
    • 发布你的 pom.xml 文件
    • 我的项目是基于gradle的,所以我在原帖中添加了build.gradle文件
    【解决方案2】:

    由于您正在使用注释,请将其添加到您的 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);
    }
    

    这应该会创建您的应用程序获取资源文件所需的映射(根据您的需要更改资源位置)。

    【讨论】:

    • 不走运,仍然得到相同的行为。甚至尝试将** 添加到所有路径中,仍然没有。
    【解决方案3】:

    好的,控制器中出现了一个非常愚蠢的错误。

    原来的控制器类是这样的:

    @Controller
    public class SurveyController {
    
        @GetMapping("/nps")
        public String getSurvey() {
            return "survey";
        }
    
        // TODO
        @PostMapping
        public String postSurvey() {
            return "";
        }
    }
    

    请注意,我忘记在 @PostMapping 注释中添加名称。这似乎导致了这个问题。当我将其更改为@PostMapping("/nps") 时,一切正常。

    以防万一它对任何人有帮助,我使用&lt;link href="/css/style.css" rel="stylesheet" type="text/css" /&gt; 来引用样式表。

    【讨论】:

    • 出于好奇,您不需要在我的答案中添加带有注释的配置或 Vinod 的 xml 吗?很高兴你把它整理好了,至少可以说访问资源可能会因为这样的事情而失败......
    • 我刚刚在没有配置的情况下对其进行了测试,它似乎可以正常工作。我相信/resources/static 目录被隐式设置为资源位置。
    猜你喜欢
    • 2017-07-27
    • 2016-05-16
    • 1970-01-01
    • 2012-11-29
    • 2021-07-31
    • 2018-09-08
    • 2013-12-09
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多