WELD-001562错误:Weld 4带泛型签名的生产者方法启动报错如何解决?
错误原因
CDI规范明确要求生产者方法的返回类型不能是方法级别的类型变量,也不能是组件类型为类型变量的数组,报错WELD-001562就是违反了这条约束。你定义的方法级泛型参数<T extends IConfiguration>无法被Weld在容器启动阶段识别到具体的可生产bean类型,无法完成前置的类型校验和注入点匹配,因此直接启动失败。
修复方案
要实现根据注入点的目标类型动态返回对应配置实例的需求,你可以把生产者方法的返回类型改为Object,配合InjectionPoint的类型信息生成对应实例即可,原有注入逻辑完全不用改:
@Produces @ConfigurationType public Object getConfigurationInstance(InjectionPoint injectionPoint){ // 读取注入点要求的目标类型 Type requiredType = injectionPoint.getType(); if (!(requiredType instanceof Class<?> clazz)) { throw new IllegalArgumentException("配置注入仅支持具体实现类类型"); } if (!IConfiguration.class.isAssignableFrom(clazz)) { throw new IllegalArgumentException("配置类必须实现IConfiguration接口"); } Class<? extends IConfiguration> configClazz = clazz.asSubclass(IConfiguration.class); // 保留你原有生成配置实例的逻辑,返回对应实例即可 return buildConfigInstance(configClazz); }
注入使用的代码和你预期的完全一致:
@Inject @ConfigurationType ServerConfig serverConfig; // ServerConfig是实现IConfiguration的JDK record或普通类 // 直接调用属性方法无压力 int port = serverConfig.port();
方案合理性
返回Object类型的带限定符的生产者会被Weld识别为可以匹配所有带对应限定符的注入点,运行时返回的实例会自动完成类型转换,既符合CDI规范要求,也完全满足你的业务需求,Weld 4.0全版本都兼容该写法。
内容的提问来源于stack exchange,提问作者Venkata Rahul S
相关产品推荐
相关产品推荐

