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

Jakarta 8+Payara环境下ConstraintValidator依赖注入失败排查

Bean Validation在REST资源中注入失败的排查方向

问题描述

我开发的Jakarta 8应用运行在Payara 5.2020.4上,CDI注入在多数场景下都正常工作,但在REST资源中使用自定义ConstraintValidator时,注入Statistic Bean抛出以下异常:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Statistic,parent=MyValidator,qualifiers={},position=0,optional=false,self=false,unqualified=null,872556488)

该Statistic Bean在其他多处注入均成功,且同一Validator在JSF视图中使用时注入正常,仅在REST资源中失效。已知Payara曾有相关BUG但已修复,现寻求自身配置疏漏的排查方向。

相关代码示例

Validator类

@Named
public class MyValidator extends ServiceValidator implements ConstraintValidator<ServiceName, String> {
    private final Statistic statistic;

    @Inject
    public MyValidator (Statistic statistic) {
        this.statistic= statistic;
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) { ... }

    public void validateName(FacesContext context, UIComponent component, String name) throws ValidatorException { ... }
}

REST资源使用示例

@Path("/rest/{serviceName}/{fileName}")
@POST
@Produces("text/plain")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response doSomething(
    @Context HttpHeaders headers,
    @PathParam("fileName") String fileName,
    @ServiceName @PathParam("serviceName") String serviceName,
    byte[] content)
{ ... }

JSF视图使用示例

<h:inputText id="ServiceName" required="true" validator="#{processScanFilesValidator.validateName}" ... >

排查方向

  • 检查Bean Validation的CDI集成配置:确认META-INF/validation.xml中是否开启CDI支持,需设置<default-provider>org.hibernate.validator.cdi.HibernateValidatorCDIProvider</default-provider>(Payara默认采用Hibernate Validator),同时确保没有禁用CDI集成的配置项。
  • 验证REST资源的CDI托管状态:确认REST资源类是否被CDI托管,比如添加@RequestScoped或其他CDI作用域注解。若REST资源仅由JAX-RS容器管理而未纳入CDI,可能导致Validator的注入上下文异常。
  • 为Validator添加明确CDI作用域:尝试给MyValidator添加@RequestScoped这类作用域注解,确保它由CDI容器创建,而非Bean Validation自身实例化(REST参数验证时可能走了非CDI的实例化路径)。
  • 排查Statistic Bean的作用域兼容性:如果Statistic Bean是@SessionScoped,REST请求通常是无状态的,无法获取会话上下文会导致注入失败。可尝试将其改为@ApplicationScoped或@RequestScoped验证是否恢复正常。
  • 检查Payara的JAX-RS与Bean Validation集成配置:确认Payara的domain.xml或glassfish-web.xml中是否正确配置了两者的集成,保证参数验证时使用CDI托管的Validator实例。
  • 排查父类ServiceValidator的影响:暂时移除extends ServiceValidator,验证注入是否正常,排查父类是否存在干扰CDI代理生成或注入逻辑的代码。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:20:18