0

我试图找到这个问题的答案,但我似乎无法找到我正在寻找的东西。因此,如果这个问题已经存在,我深表歉意。

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

描述:
使用 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 响应。也许回应如下:

“我知道你试图执行一个 [some method],但这条路径只处理 [list of proper methods]。”

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

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

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

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

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

编辑
答案:

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

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

谢谢大家!

4

3 回答 3

2

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

于 2013-11-12T14:38:30.873 回答
0

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

public ... getFooBar(HttpRequest request) {
...
}

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

于 2013-11-12T14:43:16.287 回答
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/

于 2013-11-12T14:44:53.740 回答