[英]Cast Bean<?> from BeanManager to class instance in Servlet
我有一個EJB項目,並具有以下注釋:
@Retention(RUNTIME)
@Target(TYPE)
@Qualifier
public @interface AfterComplete {
}
我有2個用此注釋修飾的類。 他們也是@Stateless
@AfterComplete
@Stateless
public class AfterCompletePrinter implements IAfterComplete {
public void afterComplete(String someValue) {
System.out.println("After complete printer: " + someValue);
}
}
@AfterComplete
@Stateless
public class AfterCompleteErrPrinter implements IAfterComplete{
public void afterComplete(String someValue) {
System.err.println(someValue);
}
}
在servlet中,我有:
@WebServlet("/")
public class DemoServlet extends HttpServlet {
@Inject
BeanManager beanManager;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Set<Bean<?>> beans = beanManager
.getBeans(Object.class,new AnnotationLiteral<AfterComplete>() {});
for (Bean<?> bean : beans) {
response.getWriter().print(bean.getBeanClass());
// IAfterComplete iac = (IAfterComplete) bean;
}
}
}
我的servlet打印:
net.mikeski.ejb_annotations.AfterCompletePrinter類net.mikeski.ejb_annotations.AfterCompleteErrPrinter
但是,如果不加注釋,此行將引發異常:
IAfterComplete iac =(IAfterComplete)bean;
例外是:
java.lang.ClassCastException:org.jboss.weld.bean.SessionBean無法轉換為net.mikeski.ejb_annotations.IAfterComplete
我如何使用bean
來執行IAfterComplete
的類的實例? bean.getName()
返回null。
我在想是否可以得到它的JNDI名稱,所以可以進行查找,但是看不到該怎么做。
如果有任何不同,則為Wildfly 10。
因此,我找到了有效的答案,它是這樣完成的:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Set<Bean<?>> beans = beanManager
.getBeans(Object.class, new AnnotationLiteral<AfterComplete>() {
});
for (Bean<?> bean : beans) {
response.getWriter().print(bean.getBeanClass());
IAfterComplete iac = (IAfterComplete) beanManager.getReference(bean, IAfterComplete.class, beanManager.createCreationalContext(bean));
iac.afterComplete("After complete called on " + iac);
}
}
我將整個工作項目放在這里的github上: https : //github.com/mikebski/ejb-custom-annotations
這是一篇簡短的博客文章,其中包含一些解釋:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.