繁体   English   中英

在 Spring Boot 中使用对象映射器时,当特定字段丢失或空白时引发错误

[英]Throwing error when a particular field is missing or blank when using object mapper in spring boot

如果缺少特定字段或该字段为空白,我正在尝试向我的 DTO 添加验证然后应该抛出一个错误,即特定字段丢失或不存在我正在使用对象映射器来映射字段,例如

  StudentDto  studentDto = mapper.convertValue(jsonObject, StudentDto.class);

DTO 类

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class StudentDto {
    @NotNull(message = "FirstName is null")
    @NotBlank(message = "FirstName is missing")
    String firstName;
    @NotNull(message = "LastName is null")
    @NotBlank(message = "LastName is missing")
    String lastName;
}

我将从 jsonObject 接收所有值,然后将这些值映射到 DTO。 当特定字段丢失或为空时,应引发错误。但目前我没有收到错误程序成功执行我该怎么做才能实现这一点

使用 Jackson 2.6,您可以使用 required,尽管您必须定义一个使用@JsonCreator注释的构造函数并为每个字段使用@JsonProperty(required = true)以强制 Jackson 在 JSON 的缺失字段和空字段上引发异常。

来自文档

请注意,从 2.6 开始,此属性仅用于 Creator 属性,以确保 JSON 中存在属性值:对于其他属性(使用 setter 或可变字段注入的属性),不执行验证。 将来可能会增加对这些情况的支持。 此属性的状态通过自省公开,其值通常由模式生成器使用,例如用于 JSON 模式的生成器。

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class StudentDto {

    String firstName;
    String lastName;

    @JsonCreator
    public StudentDto(@JsonProperty(value = "firstName", required = true) String firstName,//
                      @JsonProperty(value = "lastName", required = true) String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
}

在请求中,您必须在手动映射之前验证输入,

在控制器中必须在您的请求正文之前添加@valid

   @PostMapping(value = "/addStudent ", produces = MediaType.APPLICATION_JSON_VALUE)
     
    public Response addStudent(@Valid @RequestBody StudentDto  refundReq ) {
               
      // your code here ...
    }

    ````
   

// 还有我的建议是创建一个控制器顾问来处理错误

    @Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    // List<String> details = new ArrayList<>();
    for (ObjectError error : ex.getBindingResult().getAllErrors()) {
          details.add(error.getDefaultMessage());
        logger.error(error.getDefaultMessage());
    }
              // your code to handel response ....
    return new ResponseEntity<>(resp, HttpStatus.OK);
}

 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM