2

我将 JSF 2.1 与 CDI 和 JBoss 7.1.1 一起使用

是否可以在超类变量中注入 CDIprincipal并转换为派生类?例如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

   }
}
4

1 回答 1

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"> 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
于 2013-08-27T14:37:58.003 回答