我试图找到答案,但我似乎无法找到我要找的东西。如果这个问题已经存在,我很抱歉。
问题:
我希望能够在我的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
,但似乎并不那么喜欢。
全部谢谢!
答案 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/