如何在CDI注入的字段中从超类转换为派生类?

时间:2013-08-26 15:08:10

标签: java dependency-injection jboss7.x cdi inject

我正在使用带有CDI和JBoss 7.1.1的JSF 2.1

是否可以在超类变量principal中注入CDI并转换为派生类?例如,MyUserPrincipal是派生类。如果我写@Inject Principal principal我从调试(和重载的toString()方法)知道MyUserPrincipal代理类将被注入变量principal。但我无法将此实例强制转换为MyUserPrincipal实例。

我的2次尝试解决问题:

public class MyUserPrincipal implements Principal, Serializible{
   MyUserPrincipal (String name){
   }
   public myMethod() { }
}

//Attempt 1:
public class MyCdiClass2 implements Serializable{
   //MyUserPrincipal proxy instance will be injected. 
   @Inject Principal principal;      

   @PostConstruct init() {
       MyUserPrincipal myPrincipal = (MyUserPrincipal) pincipal;  //<--- Fails to cast! (b)
      myPrincipal.myMethod();
   }
}

//Attempt 2:
public class MyCdiClass1 implements Serializable{
   @Inject MyUserPrincipal myPrincipal; //<---- Fails to inject! (a)

   @PostConstruct init() {
       //do something with myPrincipal

   }
}

1 个答案:

答案 0 :(得分:1)

如果您没有生产者,那么您注入的实际上是一个扩展容器提供的主体的代理。实现相同接口的两个类是与类型为该接口的字段兼容的赋值,但是不能将其转换为另一个。

那就是说,似乎你想要覆盖内置的主要bean。据我所知,你只能在CDI 1.0之前使用替代品,并在CDI 1.1中使用装饰器,见CDI-164

替代示例:

package com.example;

@Alternative
public class MyUserPrincipal implements Principal, Serializible {

    // ...

    @Override
    public String getName() {
        // ...
    }
}

// and beans.xml

<?xml version="1.0" encoding="UTF-8"?>

http://java.sun.com/xml/ns/javaee/beans_1_0.xsd“&GT;              com.example.MyUserPrincipal     

装饰者示例:

@Decorator
public class MyUserPrincipal implements Principal, Serializible {

    @Inject @Delegate private Principal delegate;

    // other methods

    @Override
    public String getName() {
        // simply delegate or extend
        return this.delegate.getName();
    }
}

// again plus appropriate beans.xml