У меня есть классJersey 2 + HK2 - @ApplicationScoped не работает
@ApplicationScoped
public class Service{
private Map<String, Integer> something ;
private final Logger LOGGER = LoggerFactory.getLogger(Service.class);
@PostConstruct
public void initialize(){
something = new HashMap<>();
}
public void increase(String userName){
something.put(userName, something.getOrDefault(userName, 0) + 1);
}
public Map<String, Integer> getSomething(){
return this.something;
}
public Integer getSomethingForUser(String userName){
return something.getOrDefault(userName, 0);
}
}
Что я хочу быть глобально один экземпляр.
Проблема в том, что, когда я ввожу эту услугу в двух разных местах, у меня есть два разных экземпляра службы - что приводит к возврату всегда счетчика 0
. .toString()
возвращается следующим образом:
[email protected]
[email protected]
Я создал эту службу, чтобы проверить мою реализацию HK2-Джерси, который, по-видимому, не работает, как следует.
web.xml:
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>io.swagger.jaxrs.listing,mypackage.rest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
io.swagger.jaxrs.listing.ApiListingResource,
io.swagger.jaxrs.listing.SwaggerSerializers
</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>mypackage.config.ApplicationConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
ApplicationConfiguration.java:
public class ApplicationConfiguration extends ResourceConfig {
public ApplicationConfiguration() {
register(new AbstractBinder() {
@Override
protected void configure() {
bind(Service.class).to(Service.class);
}
});
packages(true, "com.mypackage.rest");
}
}
Без этой bind
функции, сервер выбрасывает исключение, @Inject
не был удовлетворен.
Может кто-нибудь указать, что не так?
Спасибо, работал как шарм. Можете ли вы сказать: если есть какой-либо автоматический способ привязать эти классы, или мне нужно вручную добавить их сюда? – deem
Если вы хотите опубликовать другой вопрос, я был бы рад ответить на него. –
Я думаю, что у Джерси есть собственное определение @ApplicationScoped. Причина, по которой вы могли видеть разные экземпляры, заключается в том, что она является областью прокси, и поэтому вводимые прокси различаются, даже если базовые фактические сервисы, которые вы получили, будут одинаковыми (используйте equals, а не == для сравнения) – jwells131313