在Spring 3.0 WebMVC中捕获参数解析异常

我使用Spring WebMVC来提供一个REST API。 我使用类似的方法

@RequestMapping("/path({id}") void getById(@PathVariable("id") int id) {}方法。

当客户端错误地将一个字符串而不是一个整数id放入查询中时,我得到一个NumberFormatException:

java.lang.NumberFormatException: For input string: "dojo"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:410)
    at java.lang.Long.valueOf(Long.java:525)
    at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:158)
    at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:59)
    at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:1)
    at org.springframework.core.convert.support.GenericConversionService$ConverterFactoryAdapter.convert(GenericConversionService.java:420)
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:37)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:135)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:199)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:104)
    at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:47)
    at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:526)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolvePathVariable(HandlerMethodInvoker.java:602)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:289)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:163)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)

我的问题是现在,我怎样才能优雅地抓住它? 我知道Spring提供了@ExeptionHandler注解,但我不想一般地捕捉到NFE。 我希望能够捕获所有解析异常,以便向客户端提供一个很好的错误消息。

有任何想法吗?

干杯,

一月


这是实际的例外吗? (它与您的代码示例不匹配)通常可以期望将其包装在org.springframework.beans.TypeMismatchException ,这可能足够具体,您可以@ExceptionHandler编写@ExceptionHandler方法。

如果这还不够具体,你将需要放弃Spring-Magic,只需将参数类型改为String +自己解析。 那么你可以用任何你喜欢的方式处理它。


我在这里找到了解决问题的办法http://www.coderanch.com/t/625951/Spring/REST-request-mapping-parameter-type

你试一试

@RequestMapping("/path({id:[d]+}") void getById(@PathVariable("id") int id) {} methods.

然后无效的使用将会导致404.我不确定3.0版是否支持这一点。


我不是100%确定这是否适用于@PathVaribale ,但通常对于模型绑定,您可以在路径变量旁边使用BindingResult对象,并将模型和解析错误添加到BindingResult/Errors对象。

链接地址: http://www.djcxy.com/p/4787.html

上一篇: Catch parameter parsing exception in Spring 3.0 WebMVC

下一篇: PayPal Modify Subscription