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
相关产品推荐
相关产品推荐

