You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:55:53