Различные экземпляры объекта с областью Session или Application в JEE7 - PullRequest
0 голосов
/ 04 января 2019

Я хотел бы добавить разные экземпляры одного и того же объекта (с помощью Session или Appplication Scope).

Я хотел бы иметь два разных экземпляра счетчика машины (один для красных и один для зеленых). Вместо этого он создает две ссылки на один и тот же объект.

Как я могу решить проблему? (сохранение счетчика с Application Scope в служебном остатке с Scope 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());
    }
}

Конта

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 голосов
/ 04 января 2019

Как говорит комментарий Felks, при таком подходе вам могут потребоваться две отдельные аннотации квалификатора и два производящих 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 вводится в другом месте.

...