我已经编写了一个基于Spring MVC的控制器。
@Controller
@RequestMapping("/hello")
public class JsonController {
@RequestMapping(value="/",method=RequestMethod.GET)
@ResponseBody
public Person service(){
Person person=new Person();
person.setId(3);
person.setName("666");
return person;
}
当我访问" http://localhost/app/hello"时,我得到404; 当我访问" http://localhost/app/hello/"时,我得到202 OK。 " http://localhost/app/hello"之间的区别是什么?和" http://localhost/app/hello/"?
答案 0 :(得分:3)
查看您的控制器代码
@RequestMapping("/hello")
public class JsonController
你的控制器有网址映射 - > “/你好”
和action(service)url mapping是“/”
@RequestMapping(value="/",method=RequestMethod.GET)
@ResponseBody
public Person service()
现在每当我们为控制器提供映射时,控制器的每个操作都需要控制器URL路径作为前缀(如果URL映射在控制器中定义),正如您已经提到控制器映射< strong>“/ hello”和行动服务网址映射“/” 因此,当您需要访问服务操作时,请执行以下操作:&gt; 您需要控制器的基本路径(如果在控制器中定义请求URL映射)+操作URL映射
-> "/hello" + "/" => "/hello/"
因此,在访问网址“page”的情况下,它很容易找到service
操作并返回响应
现在,当您尝试访问URL“http://localhost/app/hello/”时,URL映射搜索此映射并在您的控制器映射中找到它(因为它在您的情况下已定义),但没有为其定义的操作,原因是得到404。
您可以将其定义为默认操作,如:
@RequestMapping(method=RequestMethod.GET)
public Person defaultAction() {
----your code
}
所以现在如果您点击“http://localhost/app/hello”这将返回有效回复而不是404
答案 1 :(得分:1)
我想,这与您的tomcat重定向配置有关。尝试在context.xml中包含以下属性
mapperContextRootRedirectEnabled
说明如果启用,将在必要时由Mapper而不是默认Servlet重定向(添加尾部斜杠)对Web应用程序上下文根的请求。这更有效,但具有确认上下文路径存在的副作用。如果未指定,则使用默认值true。
mapperDirectoryRedirectEnabled
说明如果启用,将在必要时由Mapper而不是默认Servlet重定向(添加尾部斜杠)对Web应用程序目录的请求。这样更有效,但具有确认目录存在的副作用。如果未指定,则使用默认值false。
参考:https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters