Spring Boot 索引未加载

Posted

技术标签:

【中文标题】Spring Boot 索引未加载【英文标题】:Spring boot index not loading 【发布时间】:2018-11-11 22:55:04 【问题描述】:

我有一个 Spring Boot 应用程序。

我没有使用@EnableWebMvc,我的资源位于src/main/resources/static 文件夹中。当我尝试加载localhost:8080/ui/ 时,它只会下载一个随机文件(类型:八位字节流)。如果我直接使用/ui/index.html,它确实有效。

我也在使用 WebSecurityConfigurerAdapter,但这似乎不是问题的原因。

有没有人遇到过这种情况?我希望它在我请求 localhost:8080/ui/ 时加载 index.html 文件

我如何开始我的申请:

package my.package;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

//@EnableWebMvc //Breaks js resource loading
@SpringBootApplication
@EnableJpaRepositories
@EnableZuulProxy
public class MyApplication 

    public static void main(String[] args) 
        SpringApplication.run(MyApplication.class, args);
    

我的 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>nl.jaarsma</groupId>
    <artifactId>my-application</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>my-application</name>
    <description>Example app</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
<!--        <dependency> -->
<!--            <groupId>org.springframework.boot</groupId> -->
<!--            <artifactId>spring-boot-starter-actuator</artifactId> -->
<!--        </dependency> -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <!-- <scope>runtime</scope> -->
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.6</version>
        </dependency>


<!--        <dependency> -->
<!--            <groupId>org.springframework.boot</groupId> -->
<!--            <artifactId>spring-boot-starter-thymeleaf</artifactId> -->
<!--        </dependency> -->

<!--        <dependency> -->
<!--            <groupId>org.springframework.boot</groupId> -->
<!--            <artifactId>spring-boot-starter-test</artifactId> -->
<!--            <scope>test</scope> -->
<!--        </dependency> -->
<!--        <dependency> -->
<!--            <groupId>org.springframework.security</groupId> -->
<!--            <artifactId>spring-security-test</artifactId> -->
<!--            <scope>test</scope> -->
<!--        </dependency> -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


    <profiles>
        <profile>
            <id>include-ui</id>
            <build>
            <plugins>
                <plugin>
                    <groupId>com.github.eirslett</groupId>
                    <artifactId>frontend-maven-plugin</artifactId>

                    <configuration>
                        <workingDirectory>ui</workingDirectory>
                    </configuration>
                    <executions>
                        <execution>
                            <id>install node and npm</id>
                            <goals>
                                <goal>install-node-and-npm</goal>
                            </goals>
                            <configuration>
                                <nodeVersion>v6.11.1</nodeVersion>
                                <npmVersion>3.10.10</npmVersion>
                            </configuration>
                        </execution>

                        <execution>
                            <id>npm install</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>
                            <configuration>
                                <arguments>install</arguments>
                            </configuration>
                        </execution>

                        <execution>
                            <id>npm run build</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>
                            <configuration>
                                <arguments>run build</arguments>
                            </configuration>
                        </execution>

                    </executions>
                </plugin>
            </plugins>

                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                    </resource>
                    <resource>
                        <filtering>false</filtering>
                        <directory>ui/dist</directory>
                        <includes>
                            <include>**</include>
                        </includes>
                        <targetPath>static/ui</targetPath>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>
</project>

【问题讨论】:

没有使用@EnableWebMvc的任何具体原因? @Vasan 因为它似乎也破坏了资源加载。也许有一个使用 WebMVC 的解决方案有效? 尝试使用@Controller标记的空类 很遗憾这不起作用。 没有看到你的源代码,我们怎么知道问题出在哪里? 【参考方案1】:

Spring Boot 将自动添加位于以下任一目录中的静态 Web 资源:Link

/META-INF/resources/
/resources/
/static/
/public/

默认情况下,Spring Boot 从“/static”(或“/public”)的类路径中的资源中提供静态内容。

index.html 资源是特殊的,因为如果它存在,它会被用作“欢迎页面”,这意味着它将作为根资源提供,即在我们的示例中为http://localhost:8080/。 Link

对于您的情况,您需要告诉您 index.html 的弹簧位置

public class MyApplication 


    @Bean
    WebMvcConfigurer configurer () 
        return new WebMvcConfigurerAdapter() 
            @Override
            public void addResourceHandlers (ResourceHandlerRegistry registry) 
                registry.addResourceHandler("/ui/").
                          addResourceLocations("classpath:/static/ui/index.html");
            
        ;
    


    public static void main(String[] args) 
        SpringApplication.run(MyApplication.class, args);
    

【讨论】:

感谢您的回答,不幸的是,当我尝试加载 /ui/ 时,这给了我一个 404。奇怪的是,如果我将我的 UI 部署在根目录:/ 而不是 /ui/ 它工作得很好。【参考方案2】:

为什么没有将/ui 映射到index.html 的控制器?

@Controller
public class HomeController 

    @RequestMapping("/ui")
    public String home(Model model) 
         return "index.html";
    

另外,您可能需要检查this 链接以在没有@EnableWebMVC 的情况下启用它

【讨论】:

【参考方案3】:

关注这个网址https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

您可以在 application.properties 中添加静态文件模式而无需额外的代码。

spring.mvc.static-path-pattern=/** # Path pattern used for static resources.

【讨论】:

【参考方案4】:

由于您将静态资源放在“/static/ui”中,因此您必须将此通知 Spring Boot。

@Configuration
public class WebMvcConfig  extends WebMvcConfigurerAdapter 

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) 
    registry.setOrder(-1)
        .addResourceHandler("/index.html")
        .addResourceLocations("classpath:/static/ui/");
    super.addResourceHandlers(registry);

如果/static/ui 中还有其他文件,则可以使用通配符/**。更多详情请参阅 Spring 博客:https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot

【讨论】:

就个人而言,如果有真正的商业原因不使用默认值,我会让构建过程将文件放入 /static 并省去您的麻烦。 感谢您的回答。不幸的是,这也不起作用(404)。我还尝试将/index.html 更改为/ui/index.html。正如您在评论中所说,我目前已经通过将我的静态资源直接放在资源文件夹中来解决这个问题。

以上是关于Spring Boot 索引未加载的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot MVC 模板未加载(未找到 404)

Spring Boot 全局控制器建议未在 Spring 上下文中加载

Spring Boot 模板文件未加载

Spring Boot:PropertySourcesPlaceholderConfigurer 未加载系统属性

spring boot 在 application.properties 中使用 spring.profile.default 时未加载默认配置文件

Spring Boot Security 自定义登录页面未加载