- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在编写一个部署在 Tomcat 上的 Spring MVC 应用程序。见以下minimal, complete, and verifiable example
public class Application extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { };
}
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { SpringServletConfig.class };
}
protected String[] getServletMappings() {
return new String[] { "/*" };
}
}
哪里
SpringServletConfig
是
@Configuration
@ComponentScan("com.example.controllers")
@EnableWebMvc
public class SpringServletConfig {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
}
最后,我有一个
@Controller
包裹内
com.example.controllers
@Controller
public class ExampleController {
@RequestMapping(path = "/home", method = RequestMethod.GET)
public String example() {
return "index";
}
}
我的应用程序的上下文名称是
Example
.当我向
http://localhost:8080/Example/home
应用程序响应 HTTP 状态 404 并记录以下内容
WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI `[/Example/WEB-INF/jsps/index.jsp]` in `DispatcherServlet` with name 'dispatcher'
我在
/WEB-INF/jsps/index.jsp
有一个 JSP 资源我希望 Spring MVC 使用我的 Controller 来处理请求并转发到 JSP,那么为什么它以 404 响应?
最佳答案
您的标准 Spring MVC 应用程序将通过 DispatcherServlet
处理所有请求。您已向 Servlet 容器注册。DispatcherServlet
看着它的ApplicationContext
如果可用,ApplicationContext
注册 ContextLoaderListener
对于特殊的 bean,它需要设置它的请求服务逻辑。 These beans are described in the documentation .
可以说是最重要的 bean 类型 HandlerMapping
map
incoming requests to handlers and a list of pre- and post-processors(handler interceptors) based on some criteria the details of whichvary by
HandlerMapping
implementation. The most popular implementationsupports annotated controllers but other implementations exists aswell.
HandlerMapping
进一步描述了实现必须如何表现。
DispatcherServlet
查找此类型的所有 bean 并按某种顺序注册它们(可以自定义)。在处理请求时,
DispatcherServlet
遍历这些
HandlerMapping
对象并使用
getHandler
测试它们中的每一个找到一个可以处理传入请求的,表示为标准
HttpServletRequest
.从 4.3.x 开始,
如果没有找到 ,它
logs the warning你看到的
No mapping found for HTTP request with URI
[/some/path]
inDispatcherServlet
with name SomeName
NoHandlerFoundException
或立即提交带有 404 Not Found 状态代码的响应。
DispatcherServlet
找一个
HandlerMapping
那可以处理我的要求吗?
HandlerMapping
实现是
RequestMappingHandlerMapping
, 处理注册
@Controller
bean 作为处理程序(实际上是它们的
@RequestMapping
注释方法)。您可以自己声明这种类型的 bean(使用
@Bean
或
<bean>
或其他机制),也可以使用
the built-in options .这些是:
@Configuration
与 @EnableWebMvc
一起上课. <mvc:annotation-driven />
XML 配置中的成员。 RequestMappingHandlerMapping
bean (和一堆其他东西)。然而,一个
HandlerMapping
没有处理程序就不是很有用。
RequestMappingHandlerMapping
期待一些
@Controller
beans 所以你也需要声明它们,通过
@Bean
Java 配置中的方法或
<bean>
XML 配置中的声明或通过
@Controller
的组件扫描两者中的带注释的类。
确保这些 bean 存在。
@RequestMapping
带注释的处理程序方法。
spring-webmvc
库提供其他内置
HandlerMapping
实现。例如,
BeanNameUrlHandlerMapping
map
from URLs to beans with names that start with a slash ("/")
HandlerMapping
中的至少一个匹配。对象的处理程序。
HandlerMapping
beans(或者如果
detectAllHandlerMappings
是
true
),则
DispatcherServlet
注册一些
defaults .这些定义在
DispatcherServlet.properties
中在与
DispatcherServlet
相同的包中类。他们是
BeanNameUrlHandlerMapping
和
DefaultAnnotationHandlerMapping
(类似于
RequestMappingHandlerMapping
但已弃用)。
RequestMappingHandlerMapping
注册的处理程序.例如,
@Controller
喜欢
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
将在 INFO 级别记录以下内容
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
这描述了注册的映射。当您看到未找到处理程序的警告时,请将消息中的 URI 与此处列出的映射进行比较。
@RequestMapping
中指定的所有限制必须匹配 Spring MVC 才能选择处理程序。
HandlerMapping
实现记录他们自己的语句,这些语句应该提示它们的映射和相应的处理程序。
ApplicationContext
配置。
DispatcherServlet
只是一个典型的 Java EE
Servlet
.你用你的典型
<web.xml>
注册它
<servlet-class>
和
<servlet-mapping>
声明,或直接通过
ServletContext#addServlet
在
WebApplicationInitializer
,或使用 Spring boot 使用的任何机制。因此,您必须依赖于
Servlet specification 中指定的 url 映射逻辑。 , 见第 12 章。 另见
DispatcherServlet
网址映射为
/*
,从
@RequestMapping
返回 View 名称handler 方法,并期望呈现 JSP。例如,考虑一个处理程序方法,如
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
带有
InternalResourceViewResolver
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
您可能希望请求是
forwarded到路径
/WEB-INF/jsps/example-view-name.jsp
处的 JSP 资源.这不会发生。相反,假设上下文名称为
Example
,
DisaptcherServlet
会报告
No mapping found for HTTP request with URI
[/Example/WEB-INF/jsps/example-view-name.jsp]
inDispatcherServlet
with name 'dispatcher'
DispatcherServlet
映射到
/*
和
/*
匹配所有内容(除了具有更高优先级的精确匹配),
DispatcherServlet
将被选择来处理
forward
来自
JstlView
(由
InternalResourceViewResolver
返回)。
在几乎所有情况下,DispatcherServlet
不会被配置为处理这样的请求 .
DispatcherServlet
至
/
,将其标记为默认 servlet。默认 servlet 是请求的最后一个匹配项。这将允许您的典型 servlet 容器选择一个内部 Servlet 实现,映射到
*.jsp
,在尝试使用默认 servlet 之前处理 JSP 资源(例如,Tomcat 有
JspServlet
)。
关于java - 为什么 Spring MVC 响应 404 并报告 "No mapping found for HTTP request with URI [...] in DispatcherServlet"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577234/
使用 ruby 1.9.2-p290。我在尝试解析如下 URI 时遇到问题: require 'uri' my_uri = "http://www.anyserver.com/getdata?anyp
根据 http://tools.ietf.org/html/rfc3986和 http://en.wikipedia.org/wiki/Uniform_resource_identifier , UR
如何在文本 block 中发现 URI? 这个想法是将这样的文本运行变成链接。如果只考虑 http(s) 和 ftp(s) 方案,这很容易做到;但是,我猜测一般问题(考虑 tel、mailto 和其他
我的一些网址上有一些特殊字符。例如: http://blabla.com/title/?t=burası 当我从其他页面提供指向该页面的链接时,我使用: URI.encode(s) 产生这个链接: /
我在 Windows Mobile 上使用紧凑型框架/C#。 在我的应用程序中,我通过序列化对象并使用 HttpWebRequest/POST 请求向上发送信息来将数据上传到服务器。在服务器上,发布数
我正在做一个实验,我发现将 Canvas 转换为 blob,然后转换为数据 URI 会导致与直接从 Canvas 获取数据 URI 不同的 URI。打开时的内容在两个 URI 上几乎相同。 使用 bl
我正在尝试在 Rails 3 中实现 OAuth 提供程序。当我尝试授权客户端应用程序时,出现此错误。我正在使用 RESTful auth 插件和 pelles OAuth 插件。当我通过 Rails
我有一个编码的 UI 测试方法: public void MyTestMethod() { string baseUrl = "www.google.com"; GlobalVaria
我知道这是一个常见的错误,我正在使用一个已知的解决方案,但它仍然给我同样的错误: require 'open-uri' url = "http://website.com/dirs/filex[a]"
我正在尝试使用 .NET 中的 HttpClient 来使用 Web 服务,并且在我完成了 msdn 中提到的所有步骤之后 o 出现以下异常:提供了无效的请求 URI。请求 URI 必须是绝对 URI
我正在尝试检索文件的 URI。该文件存储在: /storage/emulated/0/AppName/FileName.png 如果我使用 Uri.fromFile(file),我得到的是 file:
我想知道 (SIP) URI 中的不同参数分隔符表示什么? 部分以;分隔,例如: . 其他用?隔开和 & ,例如: 最佳答案 SIP 分隔符规则来自RFC 2396 RFC 3986 已弃用.但是在
我想调用decodeUrl(...),我这样做是: import "dart:uri"; main() { decodeUrl("str"); } 但是现在有了最新的Dart-SDK,它会报告
在 URI 中,空格可以编码为 + .既然如此,那么在创建具有国际前缀的 tel URI 时是否应该对前导加号进行编码? 哪个更好?两者在实践中都有效吗? Call me Call me 最佳答案 不
我试图弄清楚电子邮件地址的格式是否可以说符合 URI 的定义,但到目前为止我还没有找到明确的确认。我希望有人可以在这里为我提供一些见解。预先感谢:) 最佳答案 是的,但带有“mailto:”前缀。 U
因此,我尝试将 ID 参数附加到 URI 的末尾,当用户单击我的列表中的项目时,用户将被发送到该 URI。我的代码如下: public void onItemClick(AdapterView par
这是 Converting file path to URI 的后续问题. 考虑: require 'uri' uri = URI.join('file:///', '/home/user/dir1/
我在 pl/sql 中创建了一个名为 tester 的包。但我收到以下消息。 绝对URI中的相对路径:java.net.URI.checkPath(URI.java:1823) --Package D
我在 gitlab 上有一个 git repo,使用私有(private) pod 和其他公共(public) pod,下面是我的 Podfile source 'git@gitlab.mycompa
我正在尝试将我的 Rails 应用程序推送到 heroku 上,我正在使用 heroku RedisToGo 附加组件我经历过这个tutorial并完成了那里提到的所有步骤。 但是在推送 heroku
我是一名优秀的程序员,十分优秀!