2017-01-12 16 views
0

У меня есть фасоль с @Resource -annotated поля:@Resource Инъекция в Weld SE

@ApplicationScoped 
open class UtilProducer {  
    ...  

    @Resource(lookup = "java:jboss/datasources/mj2") 
    private lateinit var dataSource: DataSource 

    ...  

И я хочу сделать Weld привнести что-то в этом dataSource поля.

Я пытался добавить свою собственную реализацию ResourceInjectionServices - это MyResourceInjectionServices, но это не казалось, что он пытается даже создать экземпляр моего класса

val weld = Weld() 
     .disableDiscovery() 
     .addPackages(true, UtilProducer::class.java) 
     .addPackages(true, CDIViewProvider::class.java) 
     .addBeanClass(MyResourceInjectionServices::class.java) 

Как следует настроить Weld SE впрыснуть @Resource -annotated поля ?

ответ

0

Наконец, я нашел в документации, что в таких случаях мне нужно подклассифицировать объект Weld. и переопределить createDeployment метод:

public class MyWeld extends Weld { 
    protected Deployment createDeployment(ResourceLoader resourceLoader, CDI11Bootstrap bootstrap) { 
     return super.createDeployment(new MyResourceLoader(), bootstrap); 
    } 
} 

В моем случае в Котлин по внешнему виду:

val weld = object : Weld() { 
    override fun createDeployment(resourceLoader: ResourceLoader?, bootstrap: CDI11Bootstrap?): Deployment { 
     val deployment = super.createDeployment(resourceLoader, bootstrap) 
     deployment.services.add(ResourceInjectionServices::class.java, MyResourceInjectionServices()) 
     return deployment 
    } 
}.apply { 
    disableDiscovery() 
    addPackages(true, UtilProducer::class.java) 
    addPackages(true, CDIViewProvider::class.java) 
}