当前位置: 首页 > 知识库问答 >
问题:

Spring boot中的自定义通用请求验证程序

齐迪
2023-03-14

我是Spring boot新手,我对请求字段验证有一个问题。我想出了如何在字段级别使用注释来指定自定义错误消息:

public class EmployeeRequest {

    @NotEmpty( message = "field name cannot be empty" )
    @NonNull
    private String name;

    @NotEmpty( message = "field address cannot be empty" )
    @NonNull
    private String address;
}

但是为了使用这些注释,我必须为每个请求类中的每个字段指定错误消息。此外,出于某种原因,我得到的回答也不是很明确:

“org.springframework.validation.BeanPropertyBindingResult:1错误\n字段“name”上的对象“employeeRequest”中的字段错误:拒绝值[null];代码[NotEmpty.employeeRequest.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty];参数[org.springframework.context.support.DefaultMessageSourceResolvable:code[employeeRequest.姓名,姓名];论点[];默认消息[名称];默认消息[提供名称]“

假设所有字段必须是NotEmptyNonNull,是否有更优雅、更通用的方法来对每个请求进行字段验证?

public class EmployeeController {

    @PostMapping("/test")
    @ResponseBody
    public EmployeeResponse testMethod(@RequestBody EmployeeRequest request) {
        genericFieldsValidatorForAllRequests(request);
        doSomeStuffIfRequestIsValid(request);
}

有人能提供一些想法如何实现请求验证器吗?

共有1个答案

狄宇
2023-03-14

你好像问了两个问题,希望我能试着回答这两个问题。

默认情况下,Spring Boot会捕获web请求处理程序中抛出的任何未捕获异常(例如@RequestMapping@GetMapping,等等)并将其转换为以下结构的JSON响应:

{
 "timestamp": 1500597044204,
 "status": 400,
 "error": "Bad Request",
 "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
 "message": "JSON parse error: Unrecognized token .....",
 "path": "/birds"
}

让错误响应JSON看起来不同的一种方法是创建一个异常处理程序。基本上,您可以在错误转到Spring Boot的默认错误处理程序之前捕获所需的错误。要做到这一点,你可以在同一个包装中或比控制器更高的杠杆包装中制作一个:

@ControllerAdvice
public class GlobalErrorHandler {

    @ExceptionHandler(ExceptionICareAbout.class)
    public MyErrorResponseObject handleExceptionICareAbout(ExceptionICareAbout e) {
        return new MyErrorResponseObject(<ADD CODE HERE>)
    }

}

在您的例子中,您可以为MethodArgumentNotValidException创建一个异常处理程序,并将其转换为您喜欢的错误响应。(我认为这是JSR303注释验证失败时引发的异常,但请仔细检查我)

您还可以将错误响应对象包装在ResponseEntity中

此外,如果您想捕获每个异常并阻止它们进入Spring Boot的默认异常处理程序,只需为异常类本身创建一个异常处理程序,例如@ExceptionHandler(exception.class)

在你关心的每个对象上使用JSR303注释(@NotNull@size,等等),并结合@Valid注释是我所知道的最好的方法。我会花时间思考重用代码和错误消息的方法,但这是我能想到的全部。也许我们可以在评论中得到一些好的答案。

Spring确实提供了这些你可以代替JSR303注释的验证器,但是我对它们没有太多的经验。

 类似资料:
  • 我想验证我的控制器中的一个请求参数。请求参数应该来自给定值列表中的一个,如果不是,则应该抛出错误。在下面的代码中,我希望请求参数orderBy来自@Values准许中存在的值列表。 我已经编写了一个自定义bean验证器,但不知何故,它不起作用。即使我为查询参数传递任何随机值,也不会验证并引发错误。

  • 如何使用自定义请求进行验证,我的请求使用数组键 [编辑][代码更新]显示错误: 传递给App\Http\Controllers\Controller::validate()的参数1必须是给定数组的Illumbite\Http\Request的实例,

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

  • 我正在开发spring mvc应用程序,我应该在spring mvc validator的基础上应用验证。第一步,我为类和设置控制器添加了注释,效果很好。现在我需要实现自定义验证器来执行复杂的逻辑,但我想使用现有的注释并添加额外的检查。 我的用户类: 我的验证器: 我的控制器: 那么,有可能同时使用自定义验证器和注释吗?如果是,怎么做?

  • 要通过Amazon SES发送电子邮件,用户需要验证: 发件人电子邮件地址/域和 收件人电子邮件地址 由于我有生产访问权,问题2已得到解决,但要验证发件人电子邮件地址/域,我需要通过SES控制台或api发送请求。亚马逊反过来会向发件人的电子邮件地址发送一封验证电子邮件。 问题:是否可以自定义Amazon SES发送的地址验证请求电子邮件?我搜索了一下,没有找到任何与此相关的文档。在这方面,我将不胜

  • 我使用的是spring security 3.1.3。在我正在开发的应用程序中,当用户尝试登录时,除了检查用户名和密码外,我还需要进行额外的检查以验证他们的帐户(特别是,他们的帐户没有一个标志集,表明他们被禁止登录)。我不知道最好的办法是什么。 我应该创建一个身份验证过滤器bean,并将其包含在SpringXML中的表单登录元素中吗?或者,我应该使用仅在用户成功满足用户名/密码要求时才运行的身份验