当前位置: 首页 > 面试题库 >

使用自定义HandlerMethodArgumentResolver的Spring MVC @Valid验证

景志
2023-03-14
问题内容

我想注册一个HandlerMethodArgumentResolver可以处理以下@Controller处理程序方法定义的自定义

@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {

我可以注册我的解析器,这只是创建了一个Domain通过重写通过请求参数对象,addArgumentResolver()WebMvcConfigurerAdapter。当Spring尝试解析该Domain参数时,它将遍历其列表HandlerMethodArgumentResolver(有很多),并选择supports()它的第一个。

在上面的例子中,虽然我的解析器将被调用,我的Domain论点将得到初始化,@Valid注释将不会被处理 ,并
为解析器BindingResult,一个ErrorsMethodArgumentResolver是因为它需要一个会失败@ModelAttribute@RequestBody@RequestPart在处理方法的说法,这我不没有。

如果我尝试通过添加来修复它 @ModelAttribute

@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid @ModelAttribute Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {

HandlerMethodArgumentResolver实施ModelAttributeMethodProcessor,将首先与检查supports()并解决的说法(与@ModelAttribute@Valid我的自定义冲突解决之前)。该BindingResult不会失败,但我不会对我的自定义创建行为Domain的实例。

我可以复制粘贴代码以进行验证并将其添加到中的模型中ModelAttributeMethodProcessor,但是我希望有一种更简单的方法来解析参数并执行验证,而无需在模型中添加对象。有这种方法吗?


问题答案:

很好地描述了您所面对的问题。

我检查了您概述的代码,并得出了相同的结论-没有内置的方法可以同时应用自定义
HandlerMethodArgumentResolver@Valid相关验证,唯一的选择就是执行所述ModelAttributeMethodProcessor确实这是检查该参数具有@Valid注释和调用验证逻辑相关的代码。

您可能可以从中派生您的代码HandlerMethodResolverArgumentResolverModelAttributeMethodProcessorsuper.validateIfApplicable(..)至少以这种方式调用现有代码。



 类似资料:
  • 我正试图自己解决参数问题。 我可以很容易地从NativeWebRequest获取输入参数,并将它们分派到相应的自定义@Param注释参数中。 问题是我还想在这方面做一些语法检查/验证。但如果我在“resolveArgument”中抛出异常,则会向用户显示完整的堆栈跟踪。这将是过度和不安全的。我只想向用户返回一条JSON格式的消息,以显示哪个输入参数语法有错误。

  • 在过去的几周里,我一直在努力掌握KeyClope,这样我就可以实现一种使用遗留提供商(基于Oracle,带有会话表和各种奇怪的东西)对用户进行身份验证的方法。我们计划在不久的将来解决这个问题,但目前我们必须解决这个问题,所以我们的想法是在前线使用KeyClope——利用它提供的主要好处,比如SSO——在需要身份验证的应用程序中省略传统的身份验证提供程序。 我读了一些关于构建自定义OIDC身份提供程

  • 表单验证发生在数据验证之后。如果你需要定制化这个过程,有几个不同的地方可以修改,每个地方的目的不一样。表单处理过程中要运行三种类别的验证方法。它们通常在你调用表单的is_valid() 方法时执行。还有其它方法可以触发验证过程(访问errors 属性或直接调用full_clean() ),但是通用情况下不需要。 一般情况下,如果处理的数据有问题,每个类别的验证方法都会引发ValidationErr

  • 问题内容: 我有一个看起来像这样的表格: 它的设置使得输入数据后所有必填字段和“保存”按钮都可以使用。但是,部分验证是,我将使用输入的数据使用$ http通过POST通过服务器访问服务器。 我应该在函数中放置该逻辑还是有一个更好的放置位置? 更新: * 我实现了以下内容,将其作为元素上的属性应用,但它在每次我不喜欢的按键上调用服务器/数据库: 问题答案: 您不需要在指令中发出$ http请求,更好

  • 问题内容: 我需要做一个自定义验证WTForms当输入为:数量:数量 -例如,2:1 所以,我的问题是-如何创建这种验证器? 问题答案: 你可以通过编写方法在表单内编写自定义验证器。如果它引发,则该表格将无效并显示错误。 对于你的特定情况,这是使用正则表达式的解决方案。它找到字符串的匹配项,然后使用一些拆分来取回分数。验证你可以通过访问分数的形式后。

  • 我有一个用Java验证注释注释的模型对象。 根据业务需求,将填充文件名或小时字段,以验证我编写的自定义验证器“CriteriaValidator”。 上面的模型作为方法的输入参数传入,该方法也用@Valid和@ValidCriteria注释。 我的问题是方法中的2个注释。我必须添加@Valid才能检查类中注释的约束。我的自定义验证器仅检查两个字段之一的存在:文件名或小时。 我的问题是,如何使用单个