JEE7 中具有会话或应用程序作用域的对象的不同实例



我想注入同一对象的不同实例(使用会话或应用程序范围)。

我想要两个不同的汽车计数器实例(一个用于红色,一个用于绿色)。相反,它会创建对同一对象的两个引用。

我该如何解决问题?(将具有应用程序范围的计数器保留在具有会话范围的服务休息中)。

休息会话

@Path("/api/session")
@SessionScoped   
public class RestSession implements Serializable {
    @Inject @Contatori
    private IContatore countRedCar;
    @Inject @Contatori
    private IContatore countGreenCar;   
    @Produces("application/json")
    @GET
    @Path("/red")
    public ResultDTO countRed() {
        countRedCar.conta();
        return new ResultDTO(countRedCar.getCount(),countGreenCar.getCount());
    }
    @Produces("application/json")
    @GET
    @Path("/green")
    public ResultDTO countGreen() {
        countGreenCar.conta();
        return new ResultDTO(countRedCar.getCount(),countGreenCar.getCount());
    }
}

康塔

package it.paolo.javaee.util;
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
@Contatori
public class Conta implements IContatore{
    private int count;
    public Conta() {
        count=0;
    }
    public int conta() {
        return count+=1;
    }
    public void setCount(int i) {
        count=i;
    }
    public int getCount() {
        return count;
    }
}

康塔托雷

package it.paolo.javaee.util;
import java.io.Serializable;
public interface IContatore extends Serializable {
    public int conta();
    public void setCount(int i);
    public int getCount();
}

@interface 康塔托里3

package it.paolo.javaee.util;
import javax.inject.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface Contatori3 {
}

正如 Felks 评论所说,使用这种方法,您可能需要两个单独的限定符注释和两个用于计数器的生成 bean/方法。但是,由于您似乎只有一个 Bean 实现Conta也许它不一定是最好的方法?

也许你可以尝试这样的事情:

  • 将您的类Conta更改为普通类,因此没有豆子
  • 创建一个新的@ApplicationScoped豆来保存所有可能的Contas

这个新豆子可能是这样的:

@ApplicationScoped
@Getter
public class Contas {
    private Conta contaRed = new Conta();
    private Conta contaGreen = new Conta();
}

在休息时间,注射Contas

@Inject
private Contas contas;

并访问以下内容:

contas.getContaRed().whatever();

由于Contas是应用程序范围的,getContaRed|Green()将返回相同的红色|绿色计数器,当Contas注入到其他地方时,这些计数器不会再次初始化。

最新更新