2013-05-17 4 views
0

@Produces 주석이 달린 메소드가 포함 된 @Singleton으로 주석 된 제작자 클래스가 있습니다.Weld CDI : @Alternative @Singleton 사용

이 방법의 대안을 사용하여 단위 테스트를 작성하려고하지만이를 수행 할 수 없습니다. 여기 내 코드의 개요는 다음과 같습니다

package fr.easycompany.easywrite.tools.injection; 

@Singleton 
public class Producers { 
    @Produces @Named(PREFERENCES_FILE_NAMED) 
    public String producePreferenceFileName(){ 
     return "preferences.xml"; 
    } 
} 

그리고 내 대안 : 나는 또한 다음과 같은 내용

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:weld="http://jboss.org/schema/weld/beans" 
     xsi:schemaLocation=" 
      http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd 
      http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd"> 
    <alternatives> 
     <class>fr.easycompany.easywrite.tools.injection.ProducersAlternative</class> 
     </alternatives> 
</beans> 
와 SRC/테스트/자원/META-INF에 beans.xml 환경을 만들어
package fr.easycompany.easywrite.tools.injection; 

@Singleton 
@Alternative 
public class ProducersAlternative { 
    @Produces @Named(PREFERENCES_FILE_NAMED) 
    public String producePreferenceFileName(){ 
     return "preferences_test.xml"; 
    } 
} 

실행시 항상 호출되는 것은 Producers#producePreferenceFileName()입니다. 왜 ProducersAlternative 님의 방법이 아닌가요? 싱글 톤 주입 클래스의 대안을 갖는 것이 불가능합니까?

+0

나는 당신의 코드를 시험해 보았다. ProducersAlternative # producePreferenceFileName()이 예상대로 호출됩니다. –

답변

2

저는 이것이 싱글 톤과 아무 관련이 없다고 생각합니다. 어노테이션 @Alternative는 Producer 클래스에서 사용되는 것이 아니라 Bean의 다른 구현에서 사용됩니다. 대체 스테레오 타입을 사용하고 대안 제작자 방법에 주석을 달아 대신이 작업을 할 수 있습니다. @Alternative 주석이있는 메서드는 beams.xml에서 활성화 할 수 없기 때문에 필요합니다. 그러나 고정 관념은 가능합니다 (this discussion on JBoss forum 참조). 당신은 이런 식으로 (대신에 거기 대안 생산자 클래스를 선언하는) 당신의 beans.xml 환경이 다른 관념을 활성화해야

@RequestScoped 
@Stereotype 
@Retention(RetentionPolicy.RUNTIME) 
@Alternative 
@Target({ 
    ElementType.TYPE, ElementType.METHOD 
}) 
public @interface Staging {} 

: 이렇게하려면, 당신은 이런 고정 관념을 만들 필요가

<alternatives> 
    <stereotype>full.qualified.path.to.Staging</stereotype> 
</alternatives> 

당신은 다음 다른 생산자 방식 주석을 달 수 있습니다 (가장 당신은 beans.xml 환경 당신의 생산자 클래스와의 @Alternative 주석을 삭제) :

@Singleton 
public class ProducersAlternative { 
    @Produces @Named(PREFERENCES_FILE_NAMED) @Staging 
    public String producePreferenceFileName(){ 
     return "preferences_test.xml"; 
    } 
} 

희망이 도움이 :-)

+0

알 수없는 이유로 작동하도록 @RequestScoped를 제거해야했습니다. 그것을 남겨두면 ** UnproxyableResolutionException이 발생합니다 ** –

+1

@Alternative 어노테이션은 Producer 클래스에서 잘 작동합니다. 예를 들어 링크 된 토론을 참조하십시오. 메서드에 적용 할 때 작동하지 않습니다. –