2016-06-12 2 views
1

작동하지 @ApplicationScoped 나는 수업이저지 2 + HK2 -

전 세계적으로 하나 개의 인스턴스가되고 싶어요
@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 :

bind 기능이없는
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"); 
} 

}

는 서버 @Inject 만족 아니라고 예외를 던진다.

아무도 지적 할 수 있습니까?

답변

1

HK2에는 @ApplicationScoped과 같은 것이 없습니다. 그것은 CDI (다른)입니다. HK2에는 싱글 톤 범위가 있습니다. 구성을 통해

이 자동으로 싱글 톤이됩니다. 이 문제는 컨테이너가 필요한 모든 주사를 잃는 경우에만 문제가됩니다. 다른 방법은 javax.inject.Singleton 년대 in(Scope) 방법

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

의 범위를 설정하는 것입니다.

+0

감사합니다. 매력적이었습니다. 이 클래스를 자동으로 바인드 할 수있는 방법이 있거나 여기에 수동으로 추가해야한다면 어떨까요? – deem

+0

다른 질문을 게시하고 싶다면 답해 주셔서 감사합니다. –

+0

저지에는 @ApplicationScoped에 대한 자체 정의가 있다고 생각합니다. 다른 인스턴스를 보았을 수도있는 이유는 그것이 프록시 범위이기 때문에 주입 된 프록시는 동일한 기본 서비스 (동일한 ==를 사용하여 비교할 때 == 사용) 인 경우에도 다른 경우입니다. – jwells131313

관련 문제