Java 有没有办法在@Controller方法中访问HttpRequest类型

Java 有没有办法在@Controller方法中访问HttpRequest类型,java,spring,rest,spring-mvc,httprequest,Java,Spring,Rest,Spring Mvc,Httprequest,我试图找到这个问题的答案,但我似乎找不到我要找的东西。因此,如果这个问题已经存在,我很抱歉 问题: 我希望能够在控制器中的泛型方法中访问请求的请求类型 说明: 使用SpringRoo和SpringMVC,我开发了一个小型web服务,当查询时,它将以数据库中的某些花絮作为响应。在我的一个控制器类中,我有一些方法处理@RequestMapping参数中映射的URI的各种GET、PUT、POST等 例如: @RequestMapping(method = RequestMethod.Get, valu

我试图找到这个问题的答案,但我似乎找不到我要找的东西。因此,如果这个问题已经存在,我很抱歉

问题:
我希望能够在控制器中的泛型方法中访问请求的请求类型

说明:
使用SpringRoo和SpringMVC,我开发了一个小型web服务,当查询时,它将以数据库中的某些花絮作为响应。在我的一个控制器类中,我有一些方法处理@RequestMapping参数中映射的URI的各种GET、PUT、POST等

例如:

@RequestMapping(method = RequestMethod.Get, value = "/foo/bar")
@ResponseBody
public ResponseEntity<String> getFooBar() {
    // stuff
}
我发现具有此映射的方法将捕获所有未处理的请求类型。但是我在从方法中访问请求的信息,特别是类型时遇到了问题

问题:
A.如何从方法中访问请求类型

这是正确的方法吗?正确的方法是什么

编辑
回答:

我在方法参数中添加了一个
HttpServletRequest
对象。我可以从中访问方法类型

我试着使用
HttpRequest
,但它似乎不太喜欢


谢谢大家

您可以添加方法参数
HttpServletRequest
,但我认为您最好继续使用405进行回复。然后,客户端应该进行HTTP选项调用(请参阅),您可以在那里返回允许的方法列表。

A。如果您在控制器方法中将请求作为参数提到,则可以访问该请求

public ... getFooBar(HttpRequest request) {
...
}
B.不需要添加任何其他描述,因为405状态是描述性的。

在回答“A”时,只需添加“HttpRequest req”作为控制器方法的附加参数。Spring将自动向请求注入一个引用,您可以使用标题来满足您的要求

在回答“B”-“什么是正确的方法”,这个如何

为了返回405,Spring引发了MethodArgumentNotValidException。您可以为此提供自定义处理,如下所示:

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public MyMethodArgumentMessage handleMathodArgumentNotValidException(
        MethodArgumentNotValidException ex) {
    BindingResult result = ex.getBindingResult();
    MyMethodArgumentMessage myMessage = 
            new MyMethodArgumentMessage(result.getFieldErrors());
    return myMessage;
}
您应该看看@ExceptionHandler注释。这使您可以向控制器添加以下方法。您可以定义自己的异常和相应的自定义处理程序。我使用它从REST服务返回结构良好的XML和JSON。虽然要让它工作,您需要从控制器方法中抛出特定的异常

Petri Kainulkainen在他的博客中提供了一个很好的使用方法:

我想仅仅声明一个类型为
HttpRequest
的方法参数应该是可行的。顺便说一句,Petri Kainulainen在这里写了一篇很好的博文:谢谢!我试图使用HttpEntity,但它没有我需要的信息。我会考虑实施一个选项请求,但我并不是想暗示我会停止用405回复。我只想和405一起发送更多信息。这个请求只是一个后备请求,以防他们没有命中其他任何东西。另外,它似乎不喜欢
HttpRequest
,但它喜欢
HttpServletRequest
@Vae您是对的,它应该是
HttpServletRequest
,更新了答案。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public MyMethodArgumentMessage handleMathodArgumentNotValidException(
        MethodArgumentNotValidException ex) {
    BindingResult result = ex.getBindingResult();
    MyMethodArgumentMessage myMessage = 
            new MyMethodArgumentMessage(result.getFieldErrors());
    return myMessage;
}