2016-06-12 5 views
1

У меня есть класс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 не был удовлетворен.

Может кто-нибудь указать, что не так?

ответ

1

В HK2 нет такой вещи, как @ApplicationScoped. Это только CDI (это другое). В HK2 есть одноэлементный охват. С вашей конфигурацией вы можете либо сделать

bind(new Service()).to(Service.class); 

который автоматически сделает его одиночным. Единственная проблема заключается в том, что вы теряете любую инъекцию контейнером (если требуется). Другой способ заключается в назначении области в методе in(Scope)

bind(Service.class).to(Service.class).in(Singleton.class); 

Вот javax.inject.Singleton.

+0

Спасибо, работал как шарм. Можете ли вы сказать: если есть какой-либо автоматический способ привязать эти классы, или мне нужно вручную добавить их сюда? – deem

+0

Если вы хотите опубликовать другой вопрос, я был бы рад ответить на него. –

+0

Я думаю, что у Джерси есть собственное определение @ApplicationScoped. Причина, по которой вы могли видеть разные экземпляры, заключается в том, что она является областью прокси, и поэтому вводимые прокси различаются, даже если базовые фактические сервисы, которые вы получили, будут одинаковыми (используйте equals, а не == для сравнения) – jwells131313

Смежные вопросы