2013-03-05 3 views
1

동적으로 인터페이스 Hello 구현을 선택하는 제작자를 만들고 싶습니다.CDI 프로듀서의 원인 stackoverflow

public interface Hello extends Serializable{ 

    public String sayHello(); 
} 

안녕하세요 Impls :

public class HelloBanned implements Hello{ 

    @Override 
    public String sayHello() { 
     return "Get out!!!"; 
    } 
} 

public class HelloCoolGuy implements Hello{ 

    @Override 
    public String sayHello() { 
     return "Welcome"; 
    } 
} 

내 세션빈, 내가 생산자 방식을 원하는 : 유래에

public class UsuarioHandler implements Serializable{ 

    @Inject 
    private Usuario usuario; 
    @Inject 
    @Preferred 
    Hello hello; 
    @EJB 
    UsuarioBeanLocal userEJB; 

    public String login(){ 
     usuario.setId(2L); 
     return userEJB.efetuarLogin(usuario); 
    } 
    @Produces 
    @Preferred 
    public Hello getHello(@New HelloBanned ban, 
         @New HelloCoolGuy cool){ 
     if (usuario.isBannedFlag()){ 
      return ban; 
     } 
     return cool; 
    } 
} 

이 코드의 결과. 나는 그것을 일으킬 수있는 것을 찾을 수 없습니다.

+1

스택 트레이스 –

답변

1

생산자 메서드 "getHello"를 정적 (심지어 개인용 일 수도 있음)으로 만들고 Usuario를 매개 변수로 전달하십시오.

@Produces 
@Preferred 
private static Hello getHello(@New HelloBanned ban, 
         @New HelloCoolGuy cool, Usuario usuario){ 
    if (usuario.isBannedFlag()){ 
     return ban; 
    } 
    return cool; 
} 
0

CDI에 대한 XML 빈 설명자가 누락되어 있다는 사실이 프로젝트에서 작동하지 않는 CDI와 관련된 가장 일반적인 문제점을 발견했습니다. 당신의 META-INF/beans.xml 환경 또는에 beans.xml 환경을 추가 WEB-INF/beans.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" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 

는 beans.xml 환경에 대해 자세히 알아 보려면 파일이 링크를 참조하십시오 : http://www.seamframework.org/Documentation/WhatIsBeansxmlAndWhyDoINeedIt

이것이 문제가되지 않는다면 우리는 당신이 얻고있는 오류가 무엇인지 알 수 있도록 stacktrace에 붙여 넣으십시오.

+0

을 게시하시기 바랍니다 아니, CDI 내가 주입 모든 작동 제거하면 그 작업, 그냥 "안녕하세요"생산자 주입은하지 않습니다. –

+0

그래서 스택 추적? –

+0

@Bernardo Vale 사람들이 계속 묻는 것처럼 스택 추적을 게시하십시오. – rdcrng

2

CDI 제작자는 주입을 지원합니다. UsuarioHandler 클래스가 생성자와 주입 대상이기 때문에 스택 오버플로가 예상되는 결과입니다. 그것에 대해 생각 : UsuarioHandler 주입 할 필요가 @Preferred Hello hello 관리 빈으로 인스턴스화

  1. 후.
  2. 그러면 @Preferred Hello hello의 생성자가 인스턴스화되어야하며 사용자의 UsuarioHandler도 생성해야합니다.
  3. 그러나 제작자는 @Preferred Hello hello의 인스턴스도 삽입해야합니다.
  4. 그래서 다른 제작자가 인스턴스화되는 식으로 진행됩니다. 당신의 UsuarioHandler에 대한 대처 이후

용기 제조자 또는 관리 빈으로 따라서마다 하나가 필요한 새로운 인스턴스를 생성, 그것은 프록시하지 않습니다, @Default입니다.