首页 > 解决方案 > 用于css文件但不适用于html文件的Spring Application 404

问题描述

解决方案:没有选择 SpringWebConfig 类,因为它与应用程序位于不同的包中。一旦我把它们放在一起并稍微调整了路径,一切都按预期工作。遵循有关软件包设置的错误指南。谢谢大家的帮助!

我有一个正在尝试使用注释配置的 spring 应用程序。在 localhost 上测试时,spring 会在 src/main/resources/templates 中返回 html 页面,但是我在 config.java 文件中指定的任何内容都没有受到尊重。我也无法让浏览器加载 src/main/resources/static 中的任何 css 文件。我从来没有能够让这个东西来解决 WEB-INF 中的任何问题。

我已经阅读了大约一百篇关于注释配置、xml 配置的指南,而且我今天已经重新配置了十几次。这里也有很多线程,但没有任何效果。这就像我在 webconfig.java 中的任何更改都没有被调用。

路径设置是 src/main/resources/static 中的 css 文件和 src/main/resources/templates 中的 html。

应用:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }

春季网络配置:

@EnableWebMvc // mvc:annotation-driven
@Configuration
@ComponentScan({"config"})
public class SpringWebConfig extends WebMvcConfigurerAdapter {

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

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/static/");
        viewResolver.setSuffix(".html");
        System.out.println("test");
        return viewResolver;
    }


    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
      configurer.enable("WebInitializer"); 
    }

}

Servlet 初始化器:

public class WebInitializer {

    public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[] {SpringWebConfig.class};
        }

        @Override
        protected String[] getServletMappings() {
            return new String[] {"/"};
        }

        @Override
        protected Class<?>[] getRootConfigClasses() {
            return null;
        }

    }

}

重播模板.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1"></meta>
<title>$title</title>
<link rel="stylesheet" href="/static/main.css" type="text/css"></link>
</head>
<body>
    <div class="topnav">
        <a class="active" href="#Patreon">Patreon</a> <a href="#Stats">Stats</a>
        <a href="#Ladder">Ladder</a> <a href="#Tournaments">Tournaments</a> <a
            href="#Adv. Search">Adv. Search</a> <a href="#Forum">Forum</a> <a
            href="#Wiki">Wiki</a>
</div>
<ul>
    <li>$ReplayID</li>
    <li>$TimePlayed</li>
    <li>$TimeUploaded</li>
    <li>$GameLength</li>
    <li>$Map</li>
    <li>$P1URL</li>
    <li>$P1Race</li>
    <li>$P2URL</li>
    <li>$P2Race</li>
</ul>
</body>
</html>

我可以解决这个网页,但 css 文件上有 chrome 404。我对 upload.html 和 dropzone.css 有类似的结果。

我只是想了解发生了什么,以及为什么,似乎没有任何指南可以解释为什么 springwebconfig.java 没有被引用,或者我打算把任何html 或 css 文件。我已经看过大量关于 WEB-INF 的指南,但我似乎永远无法获得要解决的参考。除了这个之外,我是否还有一些 xml 配置?我现在的设置可以很好地解析 upload.html,但是在 chrome 中我在引用 css 文件时得到 404。

TL;DR SpringWebConfig 似乎对 viewresolver 没有任何作用。我必须将 html 文件移动到 src/main/resources/templates 中才能解析,当发生这种情况时,我会在 css 文件上得到 404,无论我将 href 更改为什么,似乎。有时当我更改href(有时我认为我做对了)时,eclipse控制台中没有显示任何内容,它只是不应用css,并为css文件提供404 chrome。其他时候我在 Eclipse 中得到模板解析错误,在 chrome 中得到 404。

编辑:pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0">
        <modelVersion>4.0.0</modelVersion>
        <groupId>continuum</groupId>
        <artifactId>Continuum</artifactId>
        <version>0.1.0</version>
        <packaging>war</packaging>
        <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>1.3.2.RELEASE</version>
        </parent>
        <dependencies>
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-thymeleaf</artifactId>
                </dependency>
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                        <scope>provided</scope>
                </dependency>
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
                <dependency>
                        <groupId>scelight</groupId>
                        <artifactId>Scelight</artifactId>
                        <version>1.0</version>
                </dependency>
                <dependency>
                        <groupId>com.microsoft.sqlserver</groupId>
                        <artifactId>mssql-jdbc</artifactId>
                        <version>7.0.0.jre8</version>
                </dependency>
                <dependency>
                        <groupId>org.hibernate</groupId>
                        <artifactId>hibernate-core</artifactId>
                        <version>4.3.11.Final</version>
                </dependency>
                <dependency>
                        <groupId>c3p0</groupId>
                        <artifactId>c3p0</artifactId>
                        <version>0.9.1.2</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-lang3</artifactId>
                        <version>3.8.1</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi</artifactId>
                        <version>4.0.1</version>
                </dependency>
        </dependencies>
        <properties>
                <java.version>1.8</java.version>
        </properties>
        <build>
                <plugins>
                        <plugin>
                                <groupId>org.springframework.boot</groupId>
                                <artifactId>spring-boot-maven-plugin</artifactId>
                        </plugin>
                        <plugin>
                                <artifactId>maven-war-plugin</artifactId>
                                <version>2.6</version>
                                <configuration>
                                        <failOnMissingWebXml>false</failOnMissingWebXml>
                                </configuration>
                        </plugin>
                </plugins>
        </build>
        <repositories>
                <repository>
                        <id>spring-milestone</id>
                        <url>https://repo.spring.io/libs-release</url>
                </repository>
        </repositories>
        <pluginRepositories>
                <pluginRepository>
                        <id>spring-milestone</id>
                        <url>https://repo.spring.io/libs-release</url>
                </pluginRepository>
        </pluginRepositories>
</project>

标签: javaspringmavenspring-bootspring-mvc

解决方案


您对 css 样式表的引用似乎是错误的。我看到您正在使用 thymeleaf,因此您可以执行以下操作来链接您的 css 文件:

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

静态目录由 / 提供。因此,您的src/main/resources/static/main.css遗嘱将从/main.css. 上式也可以写成

<link rel="stylesheet" type="text/css" href="/main.css"/>

我看到你@EnableWebMvc在你的应用程序中使用了这将禁用 Spring Boot 的 Spring MVC 自动配置


推荐阅读