我正在使用带有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
}
}
答案 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