2013-08-26 29 views
1

我正在使用JSF 2.1與CDI和JBoss 7.1.1如何從超類轉換爲由CDI注入的字段中的派生類?

是否可以將CDI注入超類變量principal並轉換爲派生類?在示例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

您是否有MyUserPrincipal的生產者方法? –

+0

不,MyUserPrincipal正在啓動從登錄容器類(UsernamePasswordLoginModule)衍生而來,並來自登錄容器(JBoss-Authentication)。 – Tony

回答

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 
+0

謝謝你的回答!我會嘗試。 – Tony