我正在尝试实现一个静态验证,以防止将值传递到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对象中从数据服务访问。
非常感谢!
3条答案
按热度按时间vxbzzdmp1#
也许最好有另一个DTO来将请求的对象(这里是SampleApiDto)Map到数据层想要的对象。
bf1o4zei2#
您可以将Bean验证功能与验证组一起使用,以实现所需的结果。验证组是Java Bean验证中的一个概念,它允许您对验证约束进行分组,并根据不同的场景或用例选择性地应用它们。
首先,需要定义验证组标记接口:
然后,您应该向
id
字段添加验证(我已经将类型从primitive更改为Long Package 器)。我们假设客户端不应该发送id
,所以该字段应该为空:最后,在控制器中,您应该在所需的端点中指定验证组:
你可以在这里阅读更多:
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
n6lpvg4x3#
如果要在反序列化时忽略此字段,则应将@ JsonIgnore添加到setter方法中