Quarkus Extension JAX-RS 提供程序未注入 CDI Beans



我正在构建一个具有一组JAX-RSExceptionMapper实例的quarkus扩展。这些实例需要注入我用生产者类创建的公共错误处理程序。

当我集成测试它时,错误处理程序不会被注入映射器,但它可以被注入到其他地方(也就是我的测试资源类(。

有趣的是,如果我在一个独立的Quarkus应用程序中有映射程序和配置类,这确实可以正常工作。

这是有问题的代码:

@ApplicationScoped
public class ErrorMessageUtilProducer {
@Inject ErrorMessageUtilConfig errorMessageUtilConfig;
@Produces
@Singleton
public ErrorMessageUtil errorMessageUtil() {
return new ErrorMessageUtil(
errorMessageUtilConfig.orgCode,
errorMessageUtilConfig.systemTag,
new JacksonPropertiesLoader());
}
}

其中一个映射器(带有基类(:

public abstract class ExceptionMappingBase<T extends Throwable> implements ExceptionMapper<T> {
@Inject ErrorMessageUtil errorMessageUtil;
// dummy constructor required by CDI
public ExceptionMappingBase() {}
@Inject
public ExceptionMappingBase(ErrorMessageUtil errorMessageUtil) {
this.errorMessageUtil = errorMessageUtil;
}
/**
* Private method to resolve the appropriate HTTP Status code.
*
* @param error
* @param defaultStatus
* @return
*/
protected Response.Status resolveHttpStatusCode(Error error, Response.Status defaultStatus) {
return Response.Status.fromStatusCode(
NumberUtils.toInt(error.getStatus(), defaultStatus.getStatusCode()));
}
/**
* Private method which converts the Error into a Response object and this method assumes that
* the default error is a 500.
*
* @param error
* @return
*/
protected Response resolveResponse(Error error) {
return resolveResponse(error, Response.Status.INTERNAL_SERVER_ERROR);
}
/**
* Private method which converts the Error into a Response object.
*
* @param error
* @param defaultStatus
* @return
*/
protected Response resolveResponse(Error error, Response.Status defaultStatus) {
return Response.status(resolveHttpStatusCode(error, defaultStatus))
.entity(errorMessageUtil.createErrorsObject(error))
.build();
}
}
@Provider
public class BaseExceptionHandler extends ExceptionMappingBase<BaseException> {
// dummy constructor required by CDI
public BaseExceptionHandler() {
super();
}
@Inject
public BaseExceptionHandler(ErrorMessageUtil errorMessageUtil) {
super(errorMessageUtil);
}
@Override
public Response toResponse(BaseException exception) {
return resolveResponse(errorMessageUtil.createErrorMessage(exception));
}
}

部署模块中的构建项看起来像:

class QuarkusErrorHandlingProcessor {
private static final String FEATURE = "quarkus-error-handling";
@BuildStep
void feature(BuildProducer<FeatureBuildItem> feature) {
feature.produce(new FeatureBuildItem(FEATURE));
}
@BuildStep
public AdditionalBeanBuildItem additionalBeanBuildItem() {
return AdditionalBeanBuildItem.builder()
.addBeanClass(ErrorMessageUtilProducer.class)
.setDefaultScope(DotNames.SINGLETON)
.setUnremovable()
.build();
}
}

类似于以前的自我回答;看起来您需要将提供者注册为构建步骤,以确保它们绑定在一起:

@BuildStep
public AdditionalBeanBuildItem additionalBeanBuildItem() {
return AdditionalBeanBuildItem.builder()
.addBeanClasses(
ErrorMessageUtilProducer.class,
BaseExceptionHandler.class,
ThrowableHandler.class)
.setDefaultScope(DotNames.SINGLETON)
.setUnremovable()
.build();
}

最新更新