I've got a Spring boot application.
I'm not using @EnableWebMvc and I've got my resources in the src/main/resources/static
folder. When I try to load localhost:8080/ui/
it just downloads a random file (type: octet-stream). If I directly use /ui/index.html
it does work.
I'm also using a WebSecurityConfigurerAdapter, but this does not seem to be the cause of problem.
Has anyone encountered this before? I would like it to load the index.html file when I request localhost:8080/ui/
How I start my application:
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); } }
My pom.xml file
<?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>
4 Answers
Answers 1
Spring Boot will automatically add static web resources located within any of the following directories: Link
/META-INF/resources/ /resources/ /static/ /public/
By default Spring Boot serves static content from resources in the classpath at "/static" (or "/public").
The index.html resource is special because it is used as a "welcome page" if it exists, which means it will be served up as the root resource, i.e. at http://localhost:8080/ in our example. Link
for your case you need to tell spring location of your 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); } }
Answers 2
Why not have a controller that maps /ui
to index.html
?
@Controller public class HomeController { @RequestMapping("/ui") public String home(Model model) { return "index.html"; } }
Also, you may need to check this link to enable it without @EnableWebMVC
Answers 3
following this url https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
you can add static file pattern in application.properties without extra code.
spring.mvc.static-path-pattern=/** # Path pattern used for static resources.
Answers 4
Since you are placing your static resources in the '/static/ui' you have to inform Spring Boot of this.
@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); }
If there are other files in /static/ui
then you can use wildcards /**
. See the Spring Blog for more details: https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot
0 comments:
Post a Comment