如何使用 @RequestMapping 头部信息?

4
我正在学习SpringMVC。当我使用@RequestMapping(value="/helloWorld", headers = "content-type=text/*")并连接到http://localhost:8080/SpringMVC_10100/helloWorld时,控制台输出以下内容:

警告 org.springframework.web.servlet.PageNotFound - 找不到与servlet请求匹配的处理程序方法:路径'/helloWorld', 方法'GET',参数 map[[empty]]

我的代码是:
@Controller
public class HelloWordController {
    private Logger logger = LoggerFactory.getLogger(HelloWordController.class);

    @RequestMapping(value="/helloWorld", headers = "content-type=text/*")
    public ModelAndView helloWorld() {
        logger.debug("jin ru le");
        logger.info("The helloWorld() method is use");
        ModelAndView view = new ModelAndView();
        view.setViewName("/helloworld");
        return view;
    }
}

web.xml is

<servlet>
    <description>This is Spring MVC DispatcherServlet</description>
    <servlet-name>SpringMVC DispatchServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <description>SpringContext</description>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SpringMVC DispatchServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

为什么?
2个回答

2
很可能/helloworld没有包含在配置为您的调度程序servlet的路径中,例如,如果我有一个这样配置的servlet:
  <servlet>
    <servlet-name>BMA</servlet-name>
    <servlet-class>
       org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>BMA</servlet-name>
    <url-pattern>/bma/*</url-pattern>
  </servlet-mapping>

我有一个配置如下的控制器:

@RequestMapping(value = "/planner/plan/{planId}/delete", method = RequestMethod.GET)
public ModelAndView deletePlanConfirm(HttpServletRequest request,  
       @PathVariable("planId")   Long planId)   {}

那么在浏览器中的请求应该是这样的:
http://localhost:8080/bma/planner/plan/1223/delete

编辑: 如果您的处理程序有内容类型头缩小,请确保在请求中发送内容类型头。


我想尝试在头部参数中使用 @RequestMapping,但是没有成功。 - EdwardLau
1
@EdwardLau 这是因为请求中缺少 Content-Type 头信息。当你在浏览器中进行 GET 请求时,浏览器不会发送 Content-Type 头信息。如果通过 AJAX 进行请求,你可以显式地设置头信息。我已经编辑了我的回答。 - naikus
1
在这种情况下,您最好不要使用“Content-Type”头,而是使用“Accept”头。为GET请求指定Content-Type没有意义,因为您没有实体主体,因此没有内容可以指定类型。 - Erlend Halvorsen

1
在下面的注释中删除标题:
@RequestMapping(value="/helloWorld", headers = "content-type=text/*")

至:

@RequestMapping(value="/helloWorld",  method = RequestMethod.GET)

或者转换为:
@RequestMapping(value="/helloWorld")

应该让它工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接