对于每个不以 /api 开头的本地 REST 请求,请覆盖并重定向到默认 webapp/index.html。我计划向弹簧控制器提供任何/api。
更新 15/05/2017
让我为其他读者重新表述您的查询。(如果误解,请纠正我)
使用
Spring Boot 的背景信息,并从类路径提供静态资源
要求
所有非 api 请求都应重定向到 。404
index.html
非 API - 表示 URL 不以 开头的请求。
API - 404 应像往常一样抛出。/api
404
示例响应
- 将引发
- 将服务器索引.html
- 将重定向到/api/something
404
/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
/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 !!";
}
}
上一个答案
您可以创建一个重定向到
/index
的筛选器.html如果请求路径未启动,则使用 /api
。
// CODE REMOVED. Check Edit History If you want.