【问题标题】:Spring xml-less config: No mapping found for HTTP request with URI [duplicate]Spring xml-less 配置:没有找到带有 URI 的 HTTP 请求的映射 [重复]
【发布时间】:2016-01-05 14:22:56
【问题描述】:

我们有一个带有控制器的 Spring MVC 应用程序:

@Controller("/app")

@Controller("/app/page1")

@Controller("/app/page2")

我们有 AppInitializer:

public class AppInitializer implements WebApplicationInitializer {

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    WebApplicationContext context = getContext();

    DispatcherServlet servlet = new DispatcherServlet(context);
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet1", servlet);
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/app/*");
  }

  private AnnotationConfigWebApplicationContext getContext() {
    ... prepare app context
  }
}

运行此应用时,我们可以访问

http://localhost:8080/app

但是

http://localhost:8080/app/page1 导致错误

警告:未找到包含 URI [/app/page1] 的 HTTP 请求的映射 名称为“DispatcherServlet1”的 DispatcherServlet

http://localhost:8080/app/page2 导致错误

警告:未找到包含 URI [/app/page2] 的 HTTP 请求的映射 名称为“DispatcherServlet1”的 DispatcherServlet

我们可以通过像这样向 DispatcherServlet 添加严格映射来解决这个问题

DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet1", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/app", "/app/page1", "/app/page2");

所有页面都可以正常工作:

http://localhost:8080/app

http://localhost:8080/app/page1

http://localhost:8080/app/page2

但问题是我们每次添加新页面时都需要向 DispatcherServlet 添加映射。例如要添加第 3 页,我们需要创建控制器

@Controller("/app/page3")

添加调度器servlet映射dispatcher.addMapping("/app", "/app/page1", "/app/page2", **"/app/page3"**);

我们真的很想避免这最后一步。

dispatcher.addMapping("/app/*"); 是理想的,但正如我上面提到的,它不起作用。

知道我们缺少什么吗?

【问题讨论】:

  • 从控制器映射中删除 /app。它是调度程序 servlet 内部的映射,而不是完整的 URI。
  • @M.Deinum 谢谢伙计,这就像一个魅力。正是我们想要的:)

标签: java spring-mvc servlets servlet-mapping


【解决方案1】:

您可以像这样进行映射:

@Controller
@RequestMapping("/app/products")
public class ProductController implements Serializable {...}

【讨论】:

  • @Controller("/app/products")public class ProductController implements Serializable {...}有什么区别
  • @user606621 @Controller("/app/products") 表示您正在创建一个名为“/app/products”的 bean 作为控制器
猜你喜欢
  • 2013-07-27
  • 2012-10-26
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多