2012-07-20 73 views
2

我在堆栈上寻找了一段时间的答案。所有的答案看起来像他们说我已经有了正确的答案,但我仍然继续在下面的构造函数中获得第一行的类抛出异常。类抛出异常泛型反射参数化类型

SEVERE: Exception while loading the app : EJB Container initialization error 
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 
    at com.domain.security.logging.ElsAbstractCrudClass.<init>(ElsAbstractCrudClass.java:54) 

这是代码。看完文档后,我仍然无法弄清楚。我对泛型和思考比较陌生,所以需要一些帮助。 TIA。

public abstract class ElsAbstractCrudClass<T> { 
     Class<T> entity; 

     public ElsAbstractCrudClass() { 

[line 54] ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); 
      Type type = genericSuperclass.getActualTypeArguments()[0]; 
      this.entity = (Class<T>) type; 

     } 
    } 

这里是抽象的CRUD类的子类(SessionLog是JPA实体):

@Stateless 
public class SessionLogger extends ElsAbstractCrudClass<SessionLog> { 

    @PersistenceContext(unitName = "ELS_Soulard_PU") 
    private EntityManager em; 
    @EJB 
    DozerInstantiator di; 
    //SessionLog entity; 
    //SessionLog sessionLog = new SessionLog(); 
    static final Logger logger = Logger.getLogger(SessionLogger.class.getSimpleName()); 

    public SessionLogger() { 
    } 
... 
+1

打印出'getClass()'和'getClass()。getGenericSuperclass()'来查看它们的效果可能很有用 – newacct 2012-07-21 02:38:30

+0

好主意。我会在今天晚些时候尝试,也许或明天取决于时间...但我会尝试。 – BillR 2012-07-21 17:20:26

+0

仅供参考......我的开发箱弹了一下,我正在重建......所以我还没有试过。 :) – BillR 2012-07-25 15:18:19

回答

4

getGenericSuperclass如果超类是通用返回ParameterizedType一个实例,如果一个的Class实例不是这样。想必你有这样的:现在

class A extends B { ... } 
class B extends ElsAbstractCrudClass<Person> { ... } 

getClass()A.class与超B.class,这是不通用......

你可以概括你的代码片段,只要工作的运行时类是不通用的(递归地遍历类型层次结构,按照它们的定义随时替换类型参数)。但是,除非你有几十个CRUD类的,要求子类来传递正确的类对象更容易:

public abstract class ElsAbstractCrudClass<T> { 
    final Class<T> entityClass; 

    public ElsAbstractCrudClass(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 
} 
+0

是我建立的JPA实体类。在这种情况下,我试图使用一个SessionLog.java实体类,它包含一个没有定义关系的单个表。我没有任何东西可以扩展它。这会不会适合你描述的这个类别?当我完成时,我会有很多的粗俗课程,所以这就是为什么我想找出一个更通用的方法来做到这一点。但是,如果这开始成为麻烦拍摄中#$ @马拉松赛的痛点,我会回到你的建议(在子类中直接分配)。 :) – BillR 2012-07-20 21:35:43

+0

为了更加清晰,添加了子类。 – BillR 2012-07-21 01:21:14

0

另一种方式碰到麻烦的是,如果你的继承类使用原始类型,而不是泛型类型。换句话说,这个子类会生成你的异常,因为它的超类型只是ElsAbstractCrudClass的原始类型。

public class EE extends ElsAbstractCrudClass { ... } 

但是这一次不会因为它的超类型是通用型ElsAbstractCrudClass

public class EE extends ElsAbstractCrudClass<String> { ... } 
+0

你可能会看看我的第一个评论来评价答案吗?也许它会为你增加一些洞察力。 – BillR 2012-07-20 21:36:39

+0

对不起,我不明白你的评论。你能否提供ElsAbstractCrudClass的具体子类的前几行的一两个例子?也许这会有所帮助。 – 2012-07-20 21:57:04

+0

添加了一个子类来提供帮助。 – BillR 2012-07-21 01:20:40

2

你,因为EJB容器延长您的无状态的bean来包装方法调用EJB特定的逻辑得到这个错误。因此,在部署的时候你有财产以后这样的:

ContainerSubclass extends SessionLogger {} 

解决方案:

1)在你的构造函数首先调用

... = getClass().getSuperClass(); 
... 

2)或代码对接口,以便EJB容器将创建动态代理通过反思。

相关问题