我有一个带有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.
对于不是以/ api开头的每个本地REST请求,请覆盖并重定向 到默认的webapp / index.html。我计划将任何/ api服务提供给spring 控制器。
更新15/05/2017
让我为其他读者重新表达您的查询。(如果误解了,请纠正我)
使用Spring Boot并从classpath提供静态资源的后台
要求 所有404 非api请求都应重定向到index.html。
404
index.html
NON API-表示URL开头不为的请求/api。 API -404应该404照常抛出。
/api
示例响应 /api/something-将抛出404 /index.html-将服务器index.html- /something重定向到index.html
/api/something
/index.html-
/something
我的解决方案
如果 给定资源没有可用的处理程序,则让Spring MVC引发异常。
将以下内容添加到 application.properties
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
BaseController
例
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api") public abstract class BaseController {}
并延长这个BaseController,并确保你没有注释子类@RequestMapping
@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 !!"; } }