需要基础知识的帮助 - 我已经集成了Angular和Spring Boot。 我制作了Angular应用程序的生产版本并将6个文件复制到Spring启动静态资源文件夹中。
默认情况下,当我点击localhost时:8080 index.html呈现为Spring boot自动将其注册为欢迎页面。
现在,当我在角度内时,我可以通过ANGULAR ROUTER导航到不同的组件,并且网址也在变化。
但是当我复制相同的URL例如 - localhost:8080 / myTask并在url地址栏中输入它时会抛出404资源找不到。 因为它首先命中Spring控制器,因为它没有映射,所以它失败了。
答案 0 :(得分:3)
在Spring Boot中扩展WebMvcConfigurerAdapter的类中,在addViewControllers方法中,你应该做这样的事情
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
super.addViewControllers(registry);
registry.addViewController("/myTask").setViewName("forward:/");
}
转发,所有请求,您都可以registry.addViewController("/**").setViewName("forward:/");
答案 1 :(得分:1)
// the perfect solution(from jhipster)
@Controller
public class ClientForwardController {
@GetMapping(value = "/**/{path:[^\\.]*}")
public String forward() {
return "forward:/";
}
}
答案 2 :(得分:0)
如果您不使用Spring MVC(例如,您使用的是Jersey),也可以使用javax.servlet.Filter解决此问题:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AngularRoutingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
String requestURI = httpServletRequest.getRequestURI();
if (shouldDispatch(requestURI)) {
request.getRequestDispatcher("/").forward(request, response);
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
private boolean shouldDispatch(String requestURI) {
/* Exclude/Inlclude URLs here */
return !(requestURI.startsWith("/api") || requestURI.equals("/"));
}
}