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

时间:2019-01-04 16:37:03

标签: java java-ee-7 inject tomee

我想注入同一对象的不同实例(使用Session或Appplication Scope)。

我想要两个不同的汽车柜台实例(一个用于红色实例,另一个用于绿色实例)。 相反,它将创建对同一对象的两个引用。

我该如何解决该问题? (将计数器保留在应用程序作用域中,而服务保留在会话作用域中)。

RestSession

@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());
    }
}

Conta

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;
    }
}

IContatore

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 Contatori3

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 {
}

1 个答案:

答案 0 :(得分:0)

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

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

  • 将您的课程Conta更改为普通课程,所以没有bean
  • 创建一个新的@ApplicationScoped bean,以容纳所有可能的Contas

这个新bean可能像:

@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()将返回相同的red | green计数器,当在其他地方注入Contas时,它们不会再次初始化。