2016-01-19 71 views
3

以下代码是否违反EJB 3规范?如果是这样,我能做些什么来保留所需的功能?EJB内部的类实例化

为什么我问的原因是,14的IntelliJ产生这些警告:

  • 的“java.lang.reflect.Constructor中的”使用EJB中是不允许的“java.lang中的
  • 用法.reflect.InvocationTargetException”是不允许 EJB

我想要实例化的类(ES)是EJB没有,只是一个POJO和EJB作为这些POJO的(它们封装业务逻辑的存储库)。

@Stateless 
public class MyBean { 
    public SomeInterface createSomeClass(final Class<? extends AbstractSomeClass> someClass, final MyArgument argument) { 
     try { 
      final Constructor constructor = someClass.getDeclaredConstructor(argument.getClass()); 
      constructor.setAccessible(true); 
      return (SomeInterface) constructor.newInstance(state); 
     } catch (InvocationTargetException | NoSuchMethodException | InstantiationException | IllegalAccessException e) { 
      // TODO fix exception handling 
      throw new RuntimeException(e); 
     } 
    } 
} 

谢谢你的帮忙。

问候,

西蒙

编辑

在我看来,有在EJB 3规范,回答我的问题的第一部分,一个部分:

企业bean不得试图查询某个类以获取有关已声明的 成员的信息由于Java语言的安全规则 ,因此企业bean无法访问。企业bean不得尝试使用Reflection API访问Java编程语言的安全规则使其不可用的信息。

我从来没有听说过这个,不明白这个规则背后的原因。有状态的EJB可能是我的问题的替代方案,但这对我来说太重了。

+0

你看过CDI吗?似乎完全适合你试图达到的目标(生产者,注入建设者等)。 – BalusC

+0

我想这会工作,但目前由于项目限制,我不能介绍CDI。 – saimonsez

回答

2

本段实际上只是对EJB的最低Java 2安全策略(EJB 3.2规范的第16.3节)的重复重述。规范并不保证你的EJB有权执行它的功能。如果您的应用程序服务器中未启用Java 2安全性,或者您已授予EJB的权限来执行此操作,那么您应该没问题。 (当然,正常的注意事项进行检查/改变对象的你没有自己还是国家申请)

如果你想避免的警告,无论如何,那么另一种可能是创建一个工厂接口:

interface AbstractSomeClassFactory<T> { T create(MyArgument a); } 

...并将其传递给EJB。我没有其他伟大的想法。

+0

非常有用,谢谢。当然,工厂并不需要成为一个EJB! – saimonsez