Spring Boot-Angular - 在地址栏中输入Url会产生404

时间:2017-11-30 01:56:20

标签: java angular spring-boot

需要基础知识的帮助 - 我已经集成了Angular和Spring Boot。 我制作了Angular应用程序的生产版本并将6个文件复制到Spring启动静态资源文件夹中。

默认情况下,当我点击localhost时:8080 index.html呈现为Spring boot自动将其注册为欢迎页面。

现在,当我在角度内时,我可以通过ANGULAR ROUTER导航到不同的组件,并且网址也在变化。

但是当我复制相同的URL例如 - localhost:8080 / myTask并在url地址栏中输入它时会抛出404资源找不到。 因为它首先命中Spring控制器,因为它没有映射,所以它失败了。

3 个答案:

答案 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("/"));
  }

}