java 如何对生成的ID进行静态验证?

vbopmzt1  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(216)

我正在尝试实现一个静态验证,以防止将值传递到JSON有效负载中的POST和PUT端点。
例如,我有这个DTO:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SampleApiDto {
    
    private long id;

    private String description;

    private String columnName;

    private String code;
}

id是我们数据服务端生成的值。现在,如果你提供一个这样的payload:

{
    "id": 123,
    "description": "test10",
    "columnName": "test",
    "code": "1"
}

它抛出分离实体错误并返回500。理想情况下,我希望它返回一个400错误,并静态验证id是否存在于有效负载中。由于代码库的大小,我们不想在控制器中实现if语句。我们宁愿这是一个注解,即使它是一个自定义注解。
我试过在getter方法上使用@Null@JsonIgnore,但这两种方法都不起作用。ID应该可以在DTO对象中从数据服务访问。
非常感谢!

vxbzzdmp

vxbzzdmp1#

也许最好有另一个DTO来将请求的对象(这里是SampleApiDto)Map到数据层想要的对象。

bf1o4zei

bf1o4zei2#

您可以将Bean验证功能与验证组一起使用,以实现所需的结果。验证组是Java Bean验证中的一个概念,它允许您对验证约束进行分组,并根据不同的场景或用例选择性地应用它们。
首先,需要定义验证组标记接口:

interface OnCreate {}

然后,您应该向id字段添加验证(我已经将类型从primitive更改为Long Package 器)。我们假设客户端不应该发送id,所以该字段应该为空:

@Null(groups = OnCreate.class)
private Long id;

最后,在控制器中,您应该在所需的端点中指定验证组:

@PostMapping("/sample")
public ResponseEntity<?> createSample(@Validated(OnCreate.class) @RequestBody SampleApiDto dto, BindingResult result) {
    if (result.hasErrors()) {
        // Handle validation errors
        return ResponseEntity.badRequest().body("Validation error");
    }
        
    // Process the payload and return appropriate response
    // ...
}

你可以在这里阅读更多:
https://jakarta.ee/specifications/bean-validation/3.0/jakarta-bean-validation-spec-3.0.html#validationapi-validatorapi-groups
https://jakarta.ee/specifications/bean-validation/3.0/jakarta-bean-validation-spec-3.0.html#constraintdeclarationvalidationprocess-groupsequence
并确保您的spring应用程序已正确配置以使用bean验证:
https://docs.spring.io/spring-framework/reference/core/validation/beanvalidation.html#validation-beanvalidation-overview

n6lpvg4x

n6lpvg4x3#

如果要在反序列化时忽略此字段,则应将@ JsonIgnore添加到setter方法中

相关问题