是否可以通过动态方式(例如JNDI查找或@ApplicationScoped
)从一个getBeanByName
bean到另一个bean的引用?
例如:
@ApplicationScoped
public class MaltiService {
@Inject
BeanManager mgr;
public JsonObject execute(JsonObject request, String taskClassName) {
// for eaxample taskClassName="com.mybean.MyTask"
// Does not work ...
Set<Bean<?> beans = mgr.getBeans(taskClassName);
.....
myTasksInterface.performTask();
}
}
@ApplicationScoped
public class MyTask implements MyTasksInterface {
public performTask() {
// Do something ....
}
}
有人可以弄清楚如何通过名称或类或其他方式获取bean引用。
答案 0 :(得分:0)
已解决。
这个想法是根据JSON请求中的服务名称或某些外部配置来选择Service Bean。 @Unremovable注释可以防止在没有直接注入的情况下通过Quarkus删除bean。
@ApplicationScoped
public class MaltiService {
@Inject
BeanManager mgr;
public JsonObject execute(JsonObject request, String taskClassName) {
MyTasksInterface myTasksInterface = getServiceBean(request.get("taskClassName"));
// do somthing
return myTasksInterface.performTask(JsonObject request);
}
//Method example to get a bean reference
private MyTasksInterface getServiceBean(String beanClassName) throws Exception {
ServiceJsonTask ret = null;
Class<?> clazz = Class.forName(beanClassName);
Set<Bean<?>> beans = mgr.getBeans(clazz);
if (beans != null && beans.iterator().hasNext()) {
Bean<?> bean = beans.iterator().next();
CreationalContext<?> ctx = mgr.createCreationalContext(bean);
ret = (ServiceJsonTask) mgr.getReference(bean, clazz, ctx);
}
return ret;
}
}
// Annotate bean as @Unremovable
@ApplicationScoped
@Unremovable
public class MyTask implements MyTasksInterface {
public JsonObject performTask(JsonObject request) {
JsonObject ret = new JsonObject();
// Do something ....
return ret;
}
}