【问题标题】:customizing error response message when @requestparam is missing缺少@requestparam 时自定义错误响应消息
【发布时间】:2014-04-23 12:36:09
【问题描述】:

我已经为此查看了 stackoverflow 上的一堆现有页面,但这些页面都没有帮助:

How to customize @RequestParam error 400 response in Spring MVC

How to inform callers when required rquest parameter is missing?

我的问题非常相似:

  • 我的应用程序实际上是一个 REST api,返回 json/xml 数据而不是 html(即我不使用 jsps,而是编组将 java bean 转换为 json/xml)
  • 当我使用必需参数查询 URL 时,我得到一个 400 状态,负载中没有任何内容,没有文本,nada。
  • 我想使用我在其他地方使用的 ErrorResponse 对象返回一个 json/xml 有效负载。
  • 我使用的是 Spring 3.2.5
  • 我有一个控制器,它将 URL 映射到具有所需的方法 参数(candidateBillDay)

    @Controller
    public class AccountController extends WsController {
    
      private static final String JSP_CANDIDATE_PDD = "candidatepdd";
    
      @RequestMapping( value="/account/{externalId}/{externalIdType}/candidatepdd"
                     , method = RequestMethod.GET)
      public String getCandidatePaymentDueDateInfo( ModelMap model
                                                  , @PathVariable String externalId
                                                  , @PathVariable Integer externalIdType
                                                  , @RequestParam Integer candidateBillDay
                                                  , @RequestParam(required=false) Boolean includeCurrent ){
        ...
    
        model.addAttribute( CandidatePaymentDueDateResponse.ROOT_ELEMENT, ...));
    
        return JSP_CANDIDATE_PDD;
      }
    }
    
  • 我有一个异常处理程序,可以捕获所有类型的异常,有一些逻辑可以为某些类型(instanceof)做一些特定的位:

    @ControllerAdvice
    public class BWSExceptionHandler extends ResponseEntityExceptionHandler {
      private static final Logger LOG = LoggerFactory.getLogger(BWSExceptionHandler.class);
      @ExceptionHandler(value = { Exception.class } )
      public ResponseEntity<Object> handleOtherExceptions(final Exception ex, final WebRequest req) {
        LOG.error("Uncaught Exception: ", ex);
        ErrorResponse resp = null;
        ...
        if( ex instanceof MissingServletRequestParameterException ){
          MissingServletRequestParameterException e = (MissingServletRequestParameterException)ex;
          resp = new ErrorResponse( Validatable.ERR_CODE_FIELD_NOT_POPULATED
                                  , String.format( Validatable.MSG_FIELD_IS_REQUIRED
                                                 , e.getParameterName()
                                                 )
                                  );
          httpStatusCode = HttpStatus.BAD_REQUEST;
        }
        if(resp==null){
          resp = new ErrorResponse(new ErrorElement("unknown_error", ex.getMessage()));
        }
        return handleExceptionInternal(ex, resp, new HttpHeaders(), httpStatusCode, req);
      }
    }
    

因此,当缺少参数时,这不会做任何事情。当我得到一个实际的异常(即帐户不存在)时,它会捕获异常并作为例外工作。这使我认为没有抛出MissingServletRequestParameterException 异常,根据我读过的文档、博客和stackoverflow 页面应该抛出...

我还尝试实现一个扩展 DefaultHandlerExceptionResolver 并覆盖 handleMissingServletRequestParameter 方法的类,但效果不大(关注此博客:http://alexcuesta.wordpress.com/2011/05/11/error-handling-and-http-status-codes-with-spring-mvc/

知道我做错了什么或者我应该探索什么其他选择吗?

【问题讨论】:

  • 您是否在 XML 中声明了任何其他异常处理程序?
  • 不;我的应用程序上下文只定义了 DAO、数据源配置和其他特定于应用程序的 bean。 web.xml 定义了 1 个 servlet,将其映射到 url 模式,向其添加 1 个过滤器。 servlet xml 文件定义了一个事务管理器和所有 json/xml 编组。没有特定的异常处理
  • 您的异常处理程序是否适用于其他类型的异常?
  • 是的,如问题中所述,当我的代码或 Spring JDBC 引发异常时,我的 BWSExceptionHandler 类中的方法被调用并按预期工作。因此,据我所知,它的接线正确;这就是为什么我认为 MissingServletRequestParameterException 没有被引发......
  • 也许是ServletRequestBindingException。试试看,现在让我来

标签: java spring spring-mvc


【解决方案1】:

尝试覆盖 BWSExceptionHandler 类中的 handleMissingServletRequestParameter 方法。

@ControllerAdvice
public class BWSExceptionHandler extends ResponseEntityExceptionHandler {
  ...
  @Override
  protected ResponseEntity<Object> handleMissingServletRequestParameter(
      MissingServletRequestParameterException ex, HttpHeaders headers,
      HttpStatus status, WebRequest request) {
      // MissingServletRequestParameterException handling code goes here.
  }
  ...
  @ExceptionHandler(value = { Exception.class } )
  public ResponseEntity<Object> handleOtherExceptions(final Exception ex, 
    final WebRequest req) {
    ...
  }

}

希望这会有所帮助。

【讨论】:

  • pastebin.com/v6B0VsyB 我的不是出于某种原因。当@RequestParam(value = "token", required = true) 不存在时,返回一个空白页
猜你喜欢
  • 2018-11-13
  • 2018-02-01
  • 1970-01-01
  • 2012-02-21
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多