我知道这听起来很奇怪,将CDI(Weld)和Spring混合为控制器.
但想象一下这种情况:
现在出现的一个问题是,在我的控制器中,我如何访问我的服务对象?
我觉得这样的事情不会起作用:
@Named
@ConversationScoped
public class MyBean {
@Named
private SomeOtherBeanManagedByCDI myOtherBean; // this will work
@Autowired
private MySpringBean mySpringBean; // dont think that this will work
....
}
Run Code Online (Sandbox Code Playgroud)
关于如何在cdi bean中使用spring bean的任何想法?谢谢 !
我刚刚测试了这篇文章的解决方案,到目前为止它工作正常,我感到宽慰.
谢谢 !
QuestionCommonBusiness
public interface QuestionCommonBusiness {
void create(Question question);
void update (Question question);
void delete(Question question);
Question read(Integer id);
List<Question> all();
}
Run Code Online (Sandbox Code Playgroud)
QuestionLocalBusiness
public interface QuestionLocalBusiness extends QuestionCommonBusiness {
}
Run Code Online (Sandbox Code Playgroud)
QuestionManagerEJB
@Stateless
@Local(QuestionLocalBusiness.class)
public class QuestionManagerEJB implements QuestionLocalBusiness {
@PersistenceContext(unitName = "MyPU")
private EntityManager entityManager;
@Override
public void create(Question question) {
entityManager.persist(question);
}
@Override
public void update(Question question) {
entityManager.merge(question);
}
@Override
public void delete(Question question) {
entityManager.remove(question);
}
@Override
public Question read(Integer id) {
return entityManager.find(Question.class, id);
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 来自Weld CDI文档:
会话上下文自动传播任何JSF面部请求(JSF表单提交)或重定向.它不会自动传播非面部请求,例如,通过链接导航.
我想知道,跨越JSF的上下文传播是否也要求进行瞬态对话?更一般地说,是否存在关于瞬态和长期对话之间传播的差异的概述?
假设第一个问题的答案为"是",您是否可以提供需要长时间对话的用例?
在调用必须将新实例作为参数传递的Java方法时,如何通过CDI容器创建此新实例?
在以下示例中:我正在向异步servlet上下文添加侦听器:
@WebServlet(value = "/example", asyncSupported = true)
public class ExampleServlet extends HttpServlet {
@Override
protected void doPost(final HttpServletRequest req,
final HttpServletResponse resp) throws ServletException,
IOException {
// ... some code
AsyncContext aCtx = req.startAsync(req, resp);
aCtx.addListener(**new AsyncListener()** {
// implementation of the async listener
});
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我希望它不是手动执行这个新的AsyncListener()实例化,而是由CDI容器创建.
当然,我希望每个aync上下文都有自己的侦听器实例,否则我只是将@Inject注入一个AsyncListener作为servlet类的一个字段.
目前,找不到任何办法.有人有想法分享?
通过我在创建托管bean方面所做的所有研究,我没有注意到(或者我可能忽略的)是何时使用bean的显式命名,例如@Named(name = "someBean").
我想我很难理解为什么你想要将bean命名为除了你的类名之外的其他东西:
@Named(name = "someBean")
public class SomeBean implements Serializebale {
}
Run Code Online (Sandbox Code Playgroud)
在我看到的所有示例中,有些使用显式名称,有些只是@Named用来保留默认的类名.这些例子没有解释为什么他们使用显式命名.尝试使用除类名之外的任何东西来访问bean似乎更令人困惑.
所以我想问题是,是否有任何经验法则或约定何时你想要提供一个与你的班级名称不同的访问名称,或者如果他们有一个他们希望能够拥有的长类名,人们就会这样做打字少打字?
我正在阅读这篇文章,这让我有些困惑:在那篇文章中提到了与每个特定容器一起使用的注释:JSF,CDI或EJB容器.
作为一个初学者,我学习了JSF框架并习惯了它的@ManagedBean注释及其可选的name参数,用于从JSF页面引用bean,并且对CDI知之甚少,而我正在使用EJB作为其强大的功能(甚至阅读这篇文章之后,我仍然认为EJB比CDI更强大,功能更强.
所以...... JSF和CDI容器都有自己的注释和在网页上引用bean的方法,但EJB只有@Stateless(或@Stateful),因此无法在网页上引用,这意味着JSF容器必须总是附加EJB(因为我假设混合EJB和CDI容器是荒谬的,因为它们几乎相似但是为了这一点,我希望有人告诉我,如果我错了).
JSF容器的问题在于它
"仍然没有完整和成熟的容器"
正如在那篇文章中说的那样,我知道的最糟糕的事情是在@ManagedBean旁边的Netbeans中发出警告信息:
"javax.faces.bean包中的注释将在下一个JSF版本中被删除.相反,建议使用CDI."
(好吧,这里有另一个注释的替代包:javax.annotation.ManagedBean,但我不知道我是否可以使用它,也不知道它是否有一个参数用于在网页上引用bean以及它是哪一个)
所以现在我开始怀疑未来还应该使用哪种容器组合.CDI + EJB是未来吗?
为所有人喝彩.
Spring原型范围是否与CDI相关范围相同.
谷歌搜索引导我到博客帖子声称他们是相同的和其他声称他们相似但不完全相同而没有解释差异.
那么弹簧原型范围和cdi依赖范围之间有什么区别?
在ejb-jar.xml文件中声明的EJB拦截器与beans.xml文件中声明的CDI拦截器之间是否有任何区别?
两个拦截器都使用注释@Interceptors声明.如果CDI拦截器也适用于EJB,那么为什么存在EJB拦截器?
看完之后,
我仍然对以下事情感到困惑,如果我错了,请纠正我.
非常感谢.:)