java – 组合@RequestMapping,@ RestController和web.xml时如何应用绝对路径,为什么我的测试失败?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 组合@RequestMapping,@ RestController和web.xml时如何应用绝对路径,为什么我的测试失败?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3415字,纯文字阅读大概需要5分钟。
内容图文
![java – 组合@RequestMapping,@ RestController和web.xml时如何应用绝对路径,为什么我的测试失败?](/upload/InfoBanner/zyjiaocheng/774/92ac947485cf4d328ecd766937a20180.jpg)
我们在web.xml中定义了一个servlet:
<servlet>
<servlet-name>foo</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>foo</servlet-name>
<url-pattern>/foo/*</url-pattern>
</servlet-mapping>
在我们的控制器类中,我们使用@RequestMapping和@RestController.
package com.example.foo;
@RestController("/foo/bar/v1")
public class Baz {
@RequestMapping(value="/bar/v1/abc" /* ... */)
public String doXyz() {
现在,我知道Spring documentation for RequestMapping说
When used at the type level, all method-level mappings inherit this
primary mapping, narrowing it for a specific handler method.
换句话说,当我在类级别定义@RequestMapping(“/ foo”)时,我将在方法级别定义任何内容.对于上面的例子,如果路径是在类级别的@RequestMapping(“/ foo / bar / v1”)中定义的,而不是在@RestController中,我会因此期望/ foo / bar / v1 / bar / v1 / abc – 或/ foo / bar / v1 / abc如果方法上的路径是相对的.我的理解是正确的吗?
现在,显然,@ RestController(“/ foo / bar / v1”)在请求路径映射方面与@RequestMapping(“/ foo / bar / v1”)具有相同的效果 – 观察是否正确?
如果没有,为什么上面的代码仍然有效? / foo / part是从web.xml中获取的吗?
现在,如果我按原样保留代码,则以下测试将失败:
MvcResult result = mockMvc.perform(
get("/foo/bar/v1")
.accept(MediaType.APPLICATION_JSON_VALUE) //...
我的猜测是因为失败了
>它不读取web.xml,因此不知道/ foo前缀
>方法级别的@RequestMapping(“bar / v1”)中的路径实际上并没有缩小@restController(“/ foo / bar / v1”)中的路径.
我得到的错误信息是
javax.servlet.ServletException: No adapter for handler [com.example.foo.Baz@5b800468]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
这是测试加载的上下文配置(除了@WebAppConfiguration):
<上下文:注解的配置/>
< MVC:注解驱动/>
< context:component-scan base-package =“com.example.foo”/>
注释和web.xml如何真正协同工作,我需要配置什么来使测试通过?
解决方法:
In other words, when I define a @RequestMapping(“/foo”) on class
level, anything I define on the method level would be appended. For
the example above, if the path was defined in a
@RequestMapping(“/foo/bar/v1”) on class level, instead of in the
@RestController, I would thus expect /foo/bar/v1/bar/v1/abc – or
/foo/bar/v1/abc if the path on the method were relative. Is that
understanding of mine correct?
如果在类级别定义@RequestMapping(value =“/ foo / bar / v1”)并在方法级别定义@RequestMapping(value =“/ bar / v1 / abc”),那么,您的完整URL将变为/ foo / bar / v1 / bar / v1 / abc ie,两个请求映射字符串都将简单地附加(即,它不会像/ foo / bar / v1 / abc那样工作)
@RestController(“/foo/bar/v1”) has the same effect as
@RequestMapping(“/foo/bar/v1”) in terms of request path mapping – is
that observation correct, too?
不,它的效果不一样,因为当你在类级别添加@RestController(“/ foo / bar / v1”)时,这与请求url映射无关,而在这里,你只需命名你的控制器bean为/ foo / bar / v1,这对请求映射url没有影响.
How do the annotations and web.xml really work together, and what do I
need to configure to make the test pass?
web.xml中的servlet-mapping仅作为DispatcherServlet(前端控制器)的全局URL,然后DispatcherServlet将通过评估针对RequestMapping的url将请求委托给相应的Controller方法.
为了使测试通过url / foo / bar / v1,您可以映射控制器,如下所示:
@RestController
@RequestMapping(value="/foo/")
public class Baz {
@RequestMapping(value="bar/v1", method=RequestMethod.GET)
public String doXyz() {
}
}
内容总结
以上是互联网集市为您收集整理的java – 组合@RequestMapping,@ RestController和web.xml时如何应用绝对路径,为什么我的测试失败?全部内容,希望文章能够帮你解决java – 组合@RequestMapping,@ RestController和web.xml时如何应用绝对路径,为什么我的测试失败?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。