Rob*_*_UK 16 java spring spring-mvc spring-boot angular
我有一个带弹簧靴的单页角度应用程序.它看起来如下
src
main
java
controller
HomeController
CustomerController
OtherController
webapp
js/angular-files.js
index.html
Run Code Online (Sandbox Code Playgroud)
Spring启动正确默认为webapp文件夹并提供index.html文件.
我要做的是
1) 对于每个本地REST请求,不以/ api覆盖开头并重定向到默认的webapp/index.html.我打算为弹簧控制器提供任何/ api服务.
2)有没有办法为所有控制器添加api前缀,这样我就不必每次都写api.
例如
@RequestMapping("/api/home") can write shorthand in code @RequestMapping("/home")
Run Code Online (Sandbox Code Playgroud)
要么
@RequestMapping("/api/other-controller/:id") can write shorthand @RequestMapping("/other-controller/:id")
Run Code Online (Sandbox Code Playgroud)
编辑.. 更多注释以上解释更好
我正在寻找每个api请求,例如1) http:// localhost:8080/api/home使用api保持api并解决纠正控制器并返回json.
但是,如果有人输入URL,如http:/// localhost/some-url 或http:/// localhost/some-other/123/url 那么它将提供index.html页面并保留URL.
替代方法 - 尝试添加#ErrorViewResolver Springboot/Angular2 - 如何处理HTML5网址?
Hyp*_*cle 21
经过数小时的努力,尝试遵循数十个堆栈溢出和博客文章中的所有分散建议,我终于找到了最小的PURE spring boot + angular 6应用程序,可在非根页面刷新后始终重定向到index.html。维护所有REST API
端点路径。不@EnableWebMvc
,不@ControllerAdvice
,不更改application.properties
,不进行自定义ResourceHandlerRegistry
修改,只是简单:
你*必须*包括输出的ng build
Spring的resources/static
文件夹中。您可以通过来完成此操作maven-resources-plugin
。在这里学习:使用Maven将多个资源目录复制到独立的目标目录
@Controller
@SpringBootApplication
public class MyApp implements ErrorController {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
private static final String PATH = "/error";
@RequestMapping(value = PATH)
public String error() {
return "forward:/index.html";
}
@Override
public String getErrorPath() {
return PATH;
}
}
Run Code Online (Sandbox Code Playgroud)
resources/static
在构建时将ng-build的输出包含进来,可以使spring view redirects("forward:/index.html"
)成功。spring似乎无法重定向到resources文件夹之外的任何内容,因此,如果您尝试访问站点根目录下的页面,则它将无法正常工作。@EnableWebMvc
或更改application.properties
),导航到/
自动提供index.html(如果它已包含在resources/static
文件夹中),因此无需在其中进行更改。/error
并实现ErrorController
该行为,从而覆盖该行为(您猜到了),index.html
从而可以Angular
接管路由。HashLocationStrategy
这个问题,因为Angular不建议这样做:https : //angular.io/guide/router#which-strategy-is-bestans*_*nsh 19
对于每个本地REST请求,不以/ api覆盖开头并重定向到默认的webapp/index.html.我打算为弹簧控制器提供任何/ api服务.
更新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
Run Code Online (Sandbox Code Playgroud)
添加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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以根据需要自定义错误消息.
有没有办法为所有控制器添加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 {}
Run Code Online (Sandbox Code Playgroud)
并扩展这一点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 !!";
}
}
Run Code Online (Sandbox Code Playgroud)
上一个答案
如果请求路径没有启动Filter
,您可以创建一个重定向到哪个./index.html
/api
// CODE REMOVED. Check Edit History If you want.
Run Code Online (Sandbox Code Playgroud)
Edu*_*iek 13
试试这个
@SpringBootApplication
@RestController
class YourSpringBootApp {
// Match everything without a suffix (so not a static resource)
@RequestMapping(value = "/**/{path:[^.]*}")
public String redirect() {
// Forward to home page so that route is preserved.
return "forward:/";
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
@Controller
public class RedirectController {
/*
* Redirects all routes to FrontEnd except: '/', '/index.html', '/api', '/api/**'
*/
@RequestMapping(value = "{_:^(?!index\\.html|api).*$}")
public String redirectApi() {
return "forward:/";
}
}
Run Code Online (Sandbox Code Playgroud)
Too late on this thread, but thought it might help someone
Tried many solutions, but this looked pretty straight forward and great to me
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
import java.io.IOException;
@Configuration
public class MvcConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Credits: https://keepgrowing.in/java/springboot/make-spring-boot-surrender-routing-control-to-angular/
归档时间: |
|
查看次数: |
26997 次 |
最近记录: |