【问题标题】:Spring MVC @Valid annotation for all controllers?所有控制器的Spring MVC @Valid注释?
【发布时间】:2015-01-15 19:35:41
【问题描述】:

我见过这种不错的机制:

http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

是否可以使 @Valid 注释对所有具有验证的控制器都可用?执行以下操作似乎非常多余:

@RequestMapping(value = "/getPlayerAccounts", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public QueryResultsDTO<PlayerAccountResultDTO> getPlayerAccounts(@RequestBody **@Valid** FilteredQueryRequestDTO filteredQueryRequestDTO,
                                 **BindingResult result**) {

**this.validateDTO(result);**
return this.playerService.getPlayerAccounts(filteredQueryRequestDTO);
}

冗余代码:

@Valid

BindingResult 结果

this.validateDTO(result);

这些似乎是一个反复出现的模式,可能有人已经解决了?也许有方面? 我不在乎我所有的方法和控制器都会有 @Valid 登录,他们收到的大多数 DTO 无论如何都是有效的(因为没有应用验证注释)

谢谢

【问题讨论】:

  • 你当然可以用方面来做到这一点。但我不确定这是否真的值得麻烦。
  • 所以您认为在每个控制器中进行验证是更好的解决方案?想想一个开发者忘记加@Valid注解让我头晕
  • 嗯,这就是单元测试的用途......
  • 好的,但您仍然没有解决代码冗余问题
  • 我不认为这是一个问题。每一层抽象都增加了复杂性,复杂性往往伴随着错误和问题。

标签: java spring validation spring-mvc


【解决方案1】:

你不能省略@Valid 注解,因为这是告诉 spring 验证哪个 dto 的方式,这正是 spring 验证的工作方式。但是没有必要对每个方法都有一个 BindingResult 结果。你可以完全省略它。如果您想在验证失败时执行某些操作,您可以从异常处理方法中捕获在这种情况下抛出的MethodArgumentNotValidException(例如,您可以使用带有@ControllerAdvice 注释的类,该类将包含应用于所有的@ExceptionHandler 方法控制器 - 异常处理是一个完全不同的主题,您可以阅读相关spring mvc exception handling documentation 的更多详细信息)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2011-12-21
  • 2016-04-15
  • 2011-03-09
  • 1970-01-01
  • 2012-11-04
  • 2011-03-12
相关资源
最近更新 更多