同一台服务器上的Spring Boot + Angular2

时间:2017-05-29 16:13:31

标签: java spring angular spring-boot

我在this tutorial之后成功地将我的Angular2应用程序与Spring Boot后端集成,将已编译的JS资源放到/ ui子目录中。基本上一切正常,Angular2应用程序可以通过 appname / ui URL访问。

但是,我想知道是否有办法告诉Spring传递' / ui 路径的子网站的网址,如当前Spring拦截每个针对 / ui / * 的请求,阻止Angular2路由器正确导航到 / ui下的资源路径。

目前,我只在我的一个控制器中使用此映射:

@RequestMapping(value = "/ui")
public String uiIndex() {
    return "/ui/index.html";
}

有了这个,界面就会正确地显示在 / ui ,但是Spring会向我发送错误信息,并为其下的所有内容发送404,当我直接从浏览器处理它们时。 Angular2应用程序内部的路由器导航工作正常。

修改

我使用此配置将已编译的Angular2资源从target / ui添加到static / ui文件夹(我的项目使用maven build):

        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <includes>
                <include>*.properties</include>
                <include>templates/*.*</include>
            </includes>
        </resource>
        <resource>
            <directory>target/ui</directory>
            <targetPath>static/ui</targetPath>
        </resource>

要明确的是,唯一的问题是,当我在浏览器中输入一个URL,如 / ui / home / settings 时,Spring会拦截请求并抛出错误。我可以愉快地导航到/ ui,然后导航到Angular上下文中的/ home / settings。

3 个答案:

答案 0 :(得分:2)

经过一番反复尝试后,我终于设法做了我想做的事情。非常感谢 @EpicPandaforce useful commentthis StackOverflow post

最终解决方案是在@RequestMapping中创建一个@Controller,如下所示:

@RequestMapping(value = "/ui/**/{[path:[^\\.]*}")
public String redirectUi() {
    return "forward:/ui/index.html";
}

答案 1 :(得分:0)

您可以添加ResourceHandlers以配置在spring boot中提供的静态内容。

实施例

{{1}}

参见https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-static-content

现在,您提到的教程的第5步有更简洁的方法,您是否跳过了这一步? (SRC /主/资源/静态)

答案 2 :(得分:0)

我认为最简单的方法就是使用Angular Hash Location Strategy。

import { LocationStrategy, HashLocationStrategy } from '@angular/common';

{ provide: LocationStrategy, useClass: HashLocationStrategy }

我希望能提供帮助。