2017-10-03 6 views
1

와 proxyable하지, 나는 다음과 같은 문제가 발생 해요 : 그러나CDI 객체 주입 생성자

Caused by: org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435: Normal scoped bean class xx.Config is not proxyable because it has no no-args constructor - Managed Bean [class xx.Config] with qualifiers [@Default @Named @Any]. 
    at org.jboss.weld.bean.proxy.DefaultProxyInstantiator.validateNoargConstructor(DefaultProxyInstantiator.java:50) 
    at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:217) 
    at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:178) 

을, 나는에 주사 생성자가 할 클래스 : 기본 생성자, 변수 주입하고 PostConstruct의 방법으로

@Inject 
public Config(ConfigLocator configLocator) { 
    defaultConfigPath = configLocator.getPath(); 
    doStuff(); 
} 

,이 모두는 잘 작동하지만,이 경우 생성자 주입을 선호하는 것입니다.

어떤 생각이 잘못 되었습니까?

+0

개인 기본 생성자를 추가하면 WELD-001436이 표시됩니다.보호 된 기본 생성자를 추가했지만 ConfigLocator를 초기화하는 동안 RequestScope가 활성화되어 있지 않다는 예외가 발생합니다. –

답변

0

비공개, 인수가없는 생성자는 구현시 관리 빈에 대한 프록시를 작성하는 데 필요합니다. 비공개, 인수 없음의 존재 여부에 따라 삽입 된 생성자의 기능을 잃지 않습니다 건설자.

컨테이너는 프록시를 사용하여 가로 채기, 장식 등의 작업을 허용하고 Bean이 역 참조 될 때 올바른 컨텍스트 인스턴스를 검색합니다. 또한 콩 사이에 순환 주사를 허용해야합니다.

+0

그런 다음 어떻게하면 모든 것이 원활하게 실행되는지, 그리고 RequestScope 정의되지 않은 오류로 끝나는 생성자 주입 사례와 같이 필드 주입 사례의 차이를 설명 할 수 있을까요? –

+0

죄송합니다. 귀하의 의견과 정확히 일치하는지 모르겠습니다. 그러나 아마도 용접은 프록시가 필요하지 않다고 결정할 것입니다 (단순 콩을 주입하는 간단한 콩의 경우는 모두 차단되거나 장식되지 않고 다른 밀교 물건을 알고있는 사람) 또는 하나만 만들 수 있습니다 -arg 필드 주입으로 변경하는 동시에 public ctor). 그물은 대리인이 프록시를 만드는 데 사용되며 프록시는 종종 CDI의 추가 서비스를 제공하는 데 필요합니다 (적절한 컨텍스트에서 적절한 정상 범위의 인스턴스를 가져 오는 것과 같습니다) – covener

1

우리는 비슷한 문제를 인터페이스와 구현으로 나누었습니다. 이 같은 귀하의 경우에는 뭔가 :

public interface Config 
{ 
    // API here 
} 

@ApplicationScoped @Priority(0) 
public class ConfigImpl implements Config 
{ 
    @Inject 
    public ConfigImpl(ConfigLocator configLocator) { ... } 

    // API implementation here 
} 
0

나는 블라디미르 올바른 방향을 가리키는 생각합니다.

나는 CDI (Weld)를 배우기 때문에 모든면에서 내 대답이 100 % 정확하지 않을 수도 있지만, 인수가없는 생성자가있는 주입 지점에서 유형을 선택해야하는 것처럼 보입니다.

내가 다음 유형 계층 오늘 같은 오류가 공격 :

  • 가 제공되는 IServerInterceptor 인터페이스, 의존성을 (재미있는 사실을 소요 한 생성자가 정의 구현 AuthenticationInterceptor
  • : 이것은 (C) DI에 대해서는 아무것도 모릅니다),
  • 주입 된 생성자가 하나 뿐인 InjectableAuthenticationInterceptor이 있습니다.

나는 AuthenticationInterceptor의 인스턴스를 주입하고자하는 또 다른 빈을 가지고있다. 그것은 필드를 타입 IServerInterceptor으로 정의했을 때 작동합니다 (인터페이스와 용접은 그것을위한 프록시를 만들 수 있습니다 (?)). 그러나 필드를 AuthenticationInterceptor으로 정의하면 작동하지 않습니다. 일부 코드와

:

@Inject private AuthenticationInterceptor authenticationInterceptor; 

이제

// IServerInterceptor.java 
public interface IServerInterceptor { 
} 

// AuthenticationInterceptor.java 
public class AuthenticationInterceptor extends InterceptorAdapter { 
    private final Predicate<String> validAccessTokenString; 
    private final Function<String, AccessToken> toAccessTokenModel; 
    private final LoginManager<AccessToken> loginManager; 

    public AuthenticationInterceptor(Predicate<String> validAccessTokenString, Function<String, AccessToken> toAccessTokenModel, LoginManager<AccessToken> loginManager) { 
     this.validAccessTokenString = validAccessTokenString; 
     this.toAccessTokenModel = toAccessTokenModel; 
     this.loginManager = loginManager; 
    } 
    // ... 
} 


// InjectableAuthenticationInterceptor.java 
@ApplicationScoped 
public class InjectableAuthenticationInterceptor extends AuthenticationInterceptor { 
    @Inject 
    public InjectableAuthenticationInterceptor(LoginManager<AccessToken> loginManager) { 
     super(isWelformedAccessToken(), toAccessToken(), loginManager); 
    } 
} 

,

@Inject private IServerInterceptor authenticationInterceptor; 

가 잘 작동하지만,

하지 않습니다.