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

时间:2013-11-12 14:18:32

标签: java spring rest spring-mvc httprequest

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

问题:
我希望能够在我的Controller中的泛型方法内访问请求的请求类型。

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

例如:

@RequestMapping(method = RequestMethod.Get, value = "/foo/bar")
@ResponseBody
public ResponseEntity<String> getFooBar() {
    // stuff
}

如果向Web服务发出当前未映射的请求,则返回405错误(这是正确的),但我想返回更多信息以及405响应。也许回复一下:

“我知道你试图执行[某种方法],但这条路径只处理[正确方法列表]。”

所以我写了一个只有RequestMapping的简短方法:

@RequestMapping(value = "/foo/bar")

我发现使用此映射的方法将捕获所有未处理的请求类型。但是我无法从方法中访问请求的信息,特别是类型。

问题:
A.如何从方法中访问请求类型?
或或
B.这是正确的方法吗?什么是正确的方法?

编辑
答案:

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

我尝试使用HttpRequest,但似乎并不那么喜欢。

全部谢谢!

3 个答案:

答案 0 :(得分:2)

您可以添加HttpServletRequest的方法参数,但我认为您最好继续回复405.然后客户端应该进行HTTP OPTIONS调用(请参阅How to handle HTTP OPTIONS with Spring MVC?)并且您可以在那里返回允许的方法列表。

答案 1 :(得分:0)

一个。如果您在控制器方法

中将其作为参数提及,则可以访问请求
public ... getFooBar(HttpRequest request) {
...
}

B中。您不需要添加任何其他描述,因为405状态是描述性的。

答案 2 :(得分:0)

在回答“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在他的博客中提供了一个很好的使用方法: http://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-adding-validation-to-a-rest-api/