小编典典

带单页angular2重定向的Spring Boot

spring-boot

我有一个带有Spring Boot的单页Angular应用程序。看起来
如下:

src
  main
  java
    controller
       HomeController
       CustomerController
       OtherController
  webapp
    js/angular-files.js
    index.html

Spring Boot正确默认为webapp文件夹,并提供index.html文件。

我想要做的是:

对于每个不以/api覆盖开头的本地REST请求,并重定向到默认的webapp / index.html。我计划为/api弹簧控制器提供任何服务。

有没有一种方法为所有控制器添加API前缀,这样我就不必每次都写API?例如

@RequestMapping(“ / api / home”)可以在代码
@RequestMapping(“ / home”)中编写简写

要么

@RequestMapping("/api/other-controller/:id") can write shorthand  @RequestMapping("/other-controller/:id")

我正在寻找每个API请求,例如1) http://localhost:8080/api/home
keep API with API and resolve to correct controller and return JSON, however
if someone enters a URL like http:///localhost/some-
url or http:///localhost/some-
other/123/url then it will serve the
index.html page and keep the URL.


阅读 276

收藏
2020-05-30

共1个答案

小编典典

对于不是以/ api开头的每个本地REST请求,请覆盖并重定向
到默认的webapp / index.html。我计划将任何/ api服务提供给spring
控制器。

更新15/05/2017

让我为其他读者重新表达您的查询。(如果误解了,请纠正我)

使用Spring Boot并从classpath提供静态资源的后台

要求
所有404 非api请求都应重定向到index.html

NON API-表示URL开头不为的请求/api
API -404应该404照常抛出。

示例响应
/api/something-将抛出404
/index.html-将服务器index.html-
/something重定向到index.html

我的解决方案

如果
给定资源没有可用的处理程序,则让Spring MVC引发异常。

将以下内容添加到 application.properties

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

添加ControllerAdvice如下

@ControllerAdvice
public class RedirectOnResourceNotFoundException {

    @ExceptionHandler(value = NoHandlerFoundException.class)
    public Object handleStaticResourceNotFound(final NoHandlerFoundException ex, HttpServletRequest req, RedirectAttributes redirectAttributes) {
        if (req.getRequestURI().startsWith("/api"))
            return this.getApiResourceNotFoundBody(ex, req);
        else {
            redirectAttributes.addFlashAttribute("errorMessage", "My Custom error message");
            return "redirect:/index.html";
        }
    }

    private ResponseEntity<String> getApiResourceNotFoundBody(NoHandlerFoundException ex, HttpServletRequest req) {
        return new ResponseEntity<>("Not Found !!", HttpStatus.NOT_FOUND);
    }
}

您可以根据需要自定义错误消息。

有没有一种方法可以为所有控制器加上api前缀,这样我就不必每次都写api。

为此,您可以创建一个BaseController并将RequestMapping路径设置为
/api

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/api")
public abstract class BaseController {}

并延长这个BaseController,并确保你没有注释子类@RequestMapping

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FirstTestController extends BaseController {
    @RequestMapping(path = "/something")
    public String sayHello() {
        return "Hello World !!";
    }

}
2020-05-30