Почему Weld всегда создает новые экземпляры класса @ApplicationScoped?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему Weld всегда создает новые экземпляры класса @ApplicationScoped?

Сообщение Anonymous »

У меня настроены API Jersey Rest и Weld Dependency Injection.
Класс конечной точки REST выглядит следующим образом:

Код: Выделить всё

@Path("/userAPI")
public class UserAPI {

@Inject
private UserDAO userDAO;

@GET
@Path("/{userId}")
public Response getUser(@PathParam("userId") String userId) {
User targetUser = userDAO.getUser(userId);
return Response.ok().build();
}

}
UserDAO, который я хочу внедрить, приведен ниже:

Код: Выделить всё

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class UserDAO {

private static final Logger logger = Logger.getLogger(UserDAO.class.getName());
private String creationDate = LocalDateTime.now().toString();

public UserDAO() {
logger.info(creationDate + "> Instance of UserDAO created: " + this.getClass().getName());
}

public User getUser(String userID) {
return new User("Hello", "World");
}
}
Теперь, когда я запускаю приложение в Tomcat 9 и отправляю два запроса к конечной точке userAPI, я получаю следующие выходные данные журнала:

Код: Выделить всё

com.my.project.dao.UserDAO 
2024-07-02T15:58:56.782817700> Instance of UserDAO created: com.my.project.dao.UserDAO
com.my.project.dao.UserDAO 
2024-07-02T15:58:56.882009> Instance of UserDAO created: com.my.project.dao.UserDAO$Proxy$_$$_WeldClientProxy
com.my.project.dao.UserDAO 
2024-07-02T15:58:56.941968900> Instance of UserDAO created: com.my.project.dao.UserDAO
com.my.project.dao.UserDAO 
2024-07-02T16:13:54.397002400> Instance of UserDAO created: com.my.project.dao.UserDAO
Я знаю, что Weld использует клиентский прокси, и поэтому совершенно нормально, что конструктор класса, помеченный @ApplicationScoped, выполняется несколько раз. За прокси-серверами все равно должен быть один единственный экземпляр класса.
Однако, судя по журналам, это не работает. Кажется, при каждом отдельном запросе я получаю новый экземпляр UserDAO со свежим значением CreationDate. Если бы DI работал правильно, я бы ожидал, что каждый последующий вызов будет возвращать одно и то же значение CreationDate.
В файле журнала ошибок нет, и я думаю, что у меня есть все необходимые зависимости настроены в файле build.gradle для включения CDI в Tomcat 9:

Код: Выделить всё

dependencies {

implementation group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.1.1'

// Jersey 2.41 (compatible with Tomcat 9)
implementation 'org.glassfish.jersey.core:jersey-server:2.41'
implementation 'org.glassfish.jersey.media:jersey-media-json-jackson:2.41'
implementation 'org.glassfish.jersey.containers:jersey-container-servlet:2.41'
implementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '2.41'
implementation group: 'org.glassfish.jersey.ext.cdi', name: 'jersey-cdi1x', version: '2.41'
// Weld
implementation group: 'org.jboss.weld.servlet', name: 'weld-servlet-shaded', version: '3.1.9.Final'

}
Я добавил необходимый прослушиватель Weld в свой web.xml:

Код: Выделить всё

MYPROJECT


org.jboss.weld.environment.servlet.Listener



Я добавил файл beans.xml: Что может быть причиной того, что всегда создается новый экземпляр UserDAO?

Подробнее здесь: https://stackoverflow.com/questions/786 ... -instances

Вернуться в «JAVA»