在CDI中使用限定符注入String

amo*_*fis 6 cdi jboss-weld

我想做一件简单的事情.在CDI中注入合格String(或File).

所以我有一个限定符:

@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD,METHOD,PARAMETER,TYPE})
@Qualifier
public @interface FilesRepositoryPath {}
Run Code Online (Sandbox Code Playgroud)

我有一个制片人:

public class FilesRepositoryPathProducer {

  @Produces
  @FilesRepositoryPath
  public String getRepositoryDirectory() {
    return "path.taken.from.configuration";
  }
}
Run Code Online (Sandbox Code Playgroud)

而我正在尝试使用它:

@ApplicationScoped
public class FilesRepository {

  @Inject
  public FilesRepository(@FilesRepositoryPath String filesDirectory) {
    //Do some stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,WELD无法实例化此bean.我得到一个例外:

org.jboss.arquillian.impl.event.FiredEventException: org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001410 The injection point [field] @Inject private za.co.fnb.commercial.dms.file.FilesRepositoryBeanTest.repo has non-proxyable dependencies
Run Code Online (Sandbox Code Playgroud)

我知道这String是不可原谅的,但为什么WELD想要创建一个代理?它有@Dependent范围,所以AFAIK它不应该创建代理.我怎样才能使它工作?

小智 3

你需要默认构造函数

@ApplicationScoped
public class FilesRepository {

  public FilesRepository() {
  }

  @Inject
  public FilesRepository(@FilesRepositoryPath String filesDirectory) {
    //Do some stuff
  }
}
Run Code Online (Sandbox Code Playgroud)