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

无法在Spring boot中使用@Valid验证请求正文

梁韬
2023-03-14

我想用@Valid注释验证我的请求体,但是它在Spring Boot中不起作用

我在JAR文件中有一个请求类,我不能用两个字段来修改它。一个字段的类型为Object。我的控制器类接受这个类对象作为请求主体。当我将下面的JSON传递给控制器时,验证不起作用。下面是代码示例。

请求类:

public class Request {

    Object data;
    Map<String, Object> meta;

    public <T> T getData() throws ClassCastException {
        return (T) this.data;
    }
}

另一类:

public class StudentSignUpRequest {

     @NotNull(message = "First Name should not be empty")
     @Size(max = 64, message = "FirstName should not exceed 64 characters")
     private String firstName;

     @NotNull(message = "Last Name should not be empty")
     @Size(max = 64, message = "LastName should not exceed 64 characters")
     private String lastName;

     @NotNull(message = "Email cannot be empty")
     @Size(max = 50, message = "Email cannot exceed 50 characters")
     @Pattern(regexp = EMAIL_REGEX_PATTERN, message = "Email should contain a valid email address.")
     private String email;

     // other fields
}

控制器类:

@PostMapping(value = Constants.STUDENT_SIGN_UP)
public Response signUpStudent(@Valid @RequestBody Request request, HttpServletRequest servletRequest) {

    // retrieving the actual resource from request payload
    StudentSignUpRequest signUpRequest = request.getData(StudentSignUpRequest.class);
    // call service to sign-up student
    return loginRegistrationService.signUpStudent(signUpRequest);
}

呼叫代码设置请求如下:

StudentSignUpRequest studentSignUpRequest = new StudentSignUpRequest();
//setter methods

Request payload = new Request();
payload.setData(studentSignUpRequest);

这是我发出的请求:

超过64个字符的firstName:

示例JSON:

{
    "data": {
        "firstName": "student111111111111111111111111111111111111111111111111111111111111",
        "lastName": "somesurname",
        "email": "developer@gmail.com"
    }
}

如果不包括名字:

{
    "data": {
        "lastName": "somesurname",
        "email": "developer@gmail.com"
    }
}

这里的@Size@NotNull注释都不起作用。

有解决办法吗?

共有3个答案

邹嘉致
2023-03-14

首先对字符串使用@NotEmpty@Notblank。然后确保导入javax。验证。约束不是hibernate的约束。如果使用自定义验证器,则需要将(final BindingResult BindingResult)作为控制器方法变量的一部分。

拓拔浩阔
2023-03-14

没有验证会像您使用它的方式那样工作,您需要在请求对象内的对象上放置@valid,但由于您对该类没有控制权,另一种方式是扩展请求对象并覆盖getData方法,并在该方法上应用@valid,所以它应该是这样工作的。

章学义
2023-03-14

如果请求类是这样,验证就会起作用;

public class Request {

    @Valid
    StudentSignUpRequest data;

    // other stuff
}

由于没有数据的类类型,因此无法对其应用验证,忽略了字段上甚至没有@有效的注释这一事实。@Valid注释用于传播验证级联。

但是,由于您无法修改请求对象,所以让我们继续使用另一种方法来处理验证,而无需手动执行。

另一种方法是在从请求对象获取学生签名请求后触发验证;

StudentSignUpRequest signUpRequest = request.getData(StudentSignUpRequest.class);
loginRegistrationService.signUpStudent(signUpRequest) // validation will trigger with this call

你能做的如下;

@Service
@Validated
public class LoginRegistrationService {

    public void signUpStudent(@Valid StudentSignUpRequest signUpRequest) {
        // some logic
    }
}

使用@Validated注释,您将激活该类中public方法中任何@Validated注释参数的验证检查。

可与方法级验证一起使用,指示特定类应该在方法级进行验证(充当相应验证拦截器的切入点)

这可能代价高昂,因为您希望尽快获得任何违反约束的行为,而不必为已经注定失败的请求执行任何昂贵的工作。

 类似资料:
  • 由于这个问题,我想我理解了验证是如何工作的。 至于JPA,这里我们有一个名为JSR-303的规范,解释了Bean验证应该如何工作,然后我们也使用了常用的Hibernate Validator或Apache BVal等实现。 我正在努力在我的代码的某些部分使用。我没有使用,因为我不需要组验证。 您可以在此处找到演示项目的示例 在PropertyExample类中,您可以看到我标记了我的类以进行bea

  • 我们正在使用JAX RS为我们的一个项目实现一个REST API。要求是用户将以JSON格式传入请求对象。 让我们假设我们有一个在命中APIendpoint时调用的方法 示例请求对象: { “firstName”:“Test”, “lastName”:“Name”, “sno”:“A123” } 吸气剂和setter 现在,如果用户尝试向上面给出的请求对象添加其他参数(例如:“age”)并调用ap

  • 我需要在爪哇中使用摇摆不定(YAML文件)来验证传入的REST请求。所以任何人都可以帮我这个。提前致谢。

  • 我有一个这样的处理程序和一个自定义注释@validrequest: 注释本身看起来是这样的: 而验证器是这样的: 问题是验证被完全忽略了。我可以发送任何事件有或没有身体和一切工作无一例外。我做的一切都是根据Micronout文档,会有什么问题吗? https://docs.micronaut.io/latest/guide/index.html#BeanValidation

  • 我正在使用GRPC Java,希望使用拦截器验证请求。 许多这样的链接告诉我们使用onMessage()访问请求的方法,但我想知道他们在做什么来验证请求。 此外,onMessage()中的消息参数是通用的,我不能直接访问请求字段参数,但必须使用一些if-else/switch case键入消息,然后分别对每个字段应用检查,这是我现在的最后一个选项。 例如,下面是一个示例原型文件: 另外,我简单地打

  • 我正在尝试根据下面的代码提出帖子请求: 此请求不需要身份验证,也不需要登录和密码。在邮递员那里,我可以成功地提出请求,但当我尝试执行上述代码时,我得到了: 401未经授权 我在邮递员那里模拟了错误,它给了我下面的信息: 当我在Postman中将身份验证方法更改为“No Auth”时,请求运行良好。 我想我必须在代码中设置这个选项“No Auth”,但我不知道如何设置。 我这样做: 但错误仍在继续。