Tag: cdi

如何在CDI环境中管理EntityManager生命周期(使用Tomcat)

我正在开发一个应用程序,我已经开始使用CDI以及JSF和JPA 。 Web容器是Tomcat 。 我对我的CDI bean中的EntityManager生命周期非常困惑,我需要一个很好的建议来清除我脑海里的一些东西。 通常我读过的是EntityManager应该主要用在Java EE容器中,使用PersistenceContext注释注入它。 那么容器就会照顾它的生命。 但是,如果您不使用Java EE容器(作为Tomcat ),那么我需要管理我的EntityManager的生命。 现在哪个是我最好的选择,使用Tomcat, CDI, JSF and JPA ? 我现在正在做的是以下内容: public class EntityManagerFactoryProducer { public static final String TEST = “test”; @Produces @ApplicationScoped public EntityManagerFactory create() { return Persistence.createEntityManagerFactory(TEST); } public void destroy(@Disposes EntityManagerFactory factory) { factory.close(); } } public class EntityManagerProducer { @Inject private transient […]

如何在“会话”中为所有bean提供状态?

我有以下设计。 当客户端向服务器发出请求时,服务器会创建一个包含各种信息的状态。 有各种无状态和有状态的bean需要读写这个状态。 请参阅此非专业图表: ComputationCycle类是处理开始并按阶段工作的地方。 在每个阶段,它调用其他Manager类(其行为类似于实用程序类)来帮助计算(图表仅显示1个阶段)。 正在从CC类和管理者那里读取和写入状态,两者都是无状态的。 State拥有有状态的Employee , Department和Car类(在一些不相关的数据结构中)。 这些类也可以调用Manager类。 这是由一个简单的@Inject Manager1 。 CC使用经理的方式相同。 我的问题是如何从无状态类(以及Car , Department和Employee类)访问有状态(及其包含的类),尽管我认为解决一个将解决另一个问题。 我无法将有状态bean注入无状态bean。 因此,在客户端发出请求并开始计算周期后,如何访问与此请求相关的状态? 一种解决方案是将状态传递给无状态类中的每个方法,但这实际上非常麻烦和臃肿,因为所有方法都会在任何地方都有一个“愚蠢”的状态论证。 我怎样才能使这个设计按照我想要的方式工作?

如何使用不同的范围注入相同类的对象?

在简单性和正确性方面,注入具有不同范围的同一类对象的最佳方法是什么? 在servlet中,我想要注入具有不同范围的同一类的对象。 还是不知道是否要使用jsf。 简单性:为每个范围制作Qualifier和制作方法太多了; 在beans.xml创建一个接口,两个类以及添加和替换也是太多了; 使用Address#isCurrent()方法没有意义。 正确性:JSR299,3.11说: 不建议使用@Named作为注入点限定符。 还是不知道为什么。 虽然在注入点使用@Named可以与@ApplicationScoped和@RequestScoped一起使用,但不能与@SessionScoped 。 请参阅下面的命名代码段 。 在spring,这很容易: spring片段 名为代码段 /* Address class */ @Produces @RequestScoped @Named(value=”request”) public Address getNewAddress(){ return new Address(); } @Produces @SessionScoped @Named(value=”application”) public Address getCurrentAddress(){ return new Address(); } /* Servlet */ @Inject @RequestScoped @Named(“request”) private Address newAddress; @Inject @ApplicationScoped @Named(“application”) private Address currentAddress;

Glassfish 4,CDI中的简单示例因WELD-001408不满意的依赖性而失败

我是CDI的新手。 这是我的第一个例子,我正在尝试运行它。 在网上搜索后,我编写了以下代码:我想要注入的类 public class Temp { public Temp(){ } public String getMe(){ return “something”; } } Servlet的 @WebServlet(name = “NewServlet”, urlPatterns = {“/NewServlet”}) public class NewServlet extends HttpServlet { @Inject public Temp temp; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(“text/html;charset=UTF-8”); try (PrintWriter out = response.getWriter()) { out.println(“”); out.println(” Here it […]

CDI可以将标准库POJO注入EJB吗?

我可以将自己的POJO注入到这样的托管对象中: import javax.ejb.Stateless; import javax.inject.Inject; @Stateless public class SomeEjb { @Inject private SomePojo somePojo; } 我有这个POJO: // No annotations public class SomePojo { } 这很好用。 如果我将EJB注入JSF支持bean,我可以看到somePojo的值是非null值,如预期的那样。 但是,如果我尝试将java.util.Date注入SomeEjb ,我在部署时会遇到以下exception: Severe: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date] org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies […]

是否可以在Java SE环境中使用javax.interceptor?

我需要使用AOP来解决特定问题,但它是一个小型的独立Java程序(没有Java EE容器)。 我可以使用javax.interceptorfunction,还是必须下载一些第三方AOP实现? 如果可能的话,我宁愿使用Java SE SDK附带的东西。

升级到Netbeans 8.0.1和Glassfish 4,1后,程序包不存在

我正在学习JavaEE CDI,并且我使用NetBeans 8.0 + Glassfish 4创建了一个小应用程序。升级到NetBeans 8.0.1和Glassfish 4.1后,我收到很多错误,报告某些包不存在。 例如,我不能使用以下代码,因为我收到包javax.enterprise.event不存在的消息。 package jlacerda; import javax.inject.Inject; import javax.enterprise.event.Event; public class CMensagem { @Inject private Event gerarEvento; public String getMensagem() { return “Hello world!”; } public void gerarEvento() { Evento evento = new Evento(); evento.setMensagem(“Objeto criado a partir da classe CMensagem”); gerarEvento.fire(evento); } } 包裹也会出现这种情况: import javax.enterprise.inject.Alternative; import javax.decorator.Decorator; […]

Java EE 7 CDI手动实例化

我有一个带有@Inject注释字段的类。 我使用reflection实例化类,但我希望CDI注入实例以执行类实例字段。 有办法吗? Object myInstanceWithDependecies = Class.forName(“com.package.MyClass”).newInstance(); CDI.injectAll(myInstanceWithDependecies);//This is what i want 有人知道怎么做吗? 如果有一种方法可以使用reflection扫描每个字段,我将不胜感激。 提前致谢。

@Inject字段始终为null

我尝试@Inject一个字段(它是一个jar模块,空的beans.xml存在于META-INF下),如下所示: IDataProvider接口 public interface IDataProvider { void test(); } DataProvider实现导入javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class DataProvider implements IDataProvider { private int i; public DataProvider() { i = 42; } @Override public void test() { } } 我尝试注入DataProvider的类 import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @ApplicationScoped public class DataController { @Inject private IDataProvider dataProvider; private int k; public DataController() { k […]

CDI部署失败:WELD-001414 Bean名称不明确

我有一个应用程序,它有多个模块和各种依赖项。 当我在Glassfish 4上部署应用程序时,我收到错误: org.jboss.weld.exceptions.DeploymentException: WELD-001414 Bean name is ambiguous. Name JerseyClassAnalyzer resolves to beans: [Managed Bean [class org.glassfish.jersey.internal.inject.JerseyClassAnalyzer] with qualifiers [@Default @Named @Any], Managed Bean [class org.glassfish.jersey.internal.inject.JerseyClassAnalyzer] with qualifiers [@Default @Named @Any]] 可能是什么原因? 我已经看到了关于这个的主题,解决方案是编辑注释,但这不是我的EJB ,只是一个依赖项。 我怎样才能避免这种exception? 我正在使用Java EE 6与JDK 1.7和Glassfish 4.0。