在Quarkus中使用Jakarta Validation时,@Valid能否验证方法参数非空?
在Quarkus中通过Jakarta Validation同时验证对象非空与字段级规则
问题背景
我在Quarkus应用中使用Jakarta Validation(jakarta.validation),希望确保传入服务方法的Article对象不为null,同时对其应用字段级的@Valid验证。
Article实体代码
@Entity @Table(name = "article") @Data @NoArgsConstructor public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", nullable = false) @NotNull(message="Article name cannot be null.") @NotEmpty(message="Article name cannot be empty.") private String name; @Column(name = "articlenumber", nullable = false) @NotNull(message="Article number cannot be null.") @NotEmpty(message="Article number cannot be empty.") private String articlenumber; }
原服务方法代码
@Transactional public Article createArticle(@Valid Article article) { if (articleRepository.findByArticleNumber(article.getArticlenumber()) != null) { throw new IllegalArgumentException("Article with this articlenumber already exists."); } articleRepository.persist(article); return article; }
问题
能否让@Valid像验证字段一样强制对象本身不为null,而无需在服务中添加自定义空检查?
解决方案
可以通过给方法参数同时添加@NotNull和@Valid注解来实现,完全替代自定义空检查。
具体修改
调整服务方法的参数注解即可:
@Transactional public Article createArticle(@NotNull(message = "Article对象不能为null") @Valid Article article) { if (articleRepository.findByArticleNumber(article.getArticlenumber()) != null) { throw new IllegalArgumentException("该编号的文章已存在"); } articleRepository.persist(article); return article; }
原理说明
@NotNull专门负责校验传入的Article对象本身不能为null,一旦对象为空,Jakarta Validation会直接抛出ConstraintViolationException,不会执行后续的字段验证逻辑。- 只有当对象非null时,
@Valid才会触发对象内部的字段级校验,比如检查name和articlenumber是否符合@NotNull、@NotEmpty的规则。
这样就能同时完成对象非空校验和字段级规则校验,不需要再写自定义的null判断代码。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

