EJB

时间:2016-01-19 10:17:13

标签: java-ee reflection intellij-idea ejb

以下代码是否违反了EJB 3规范?如果是这样,我该怎么做才能保留所需的功能?

我问的原因是IntelliJ 14产生了这些警告:

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

我想要实例化的类不是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不得尝试查询类以获取有关声明的信息   由于安全规则而无法以其他方式访问企业bean的成员   Java语言企业bean不得尝试使用Reflection API进行访问   有关Java编程语言的安全规则不可用的信息。

我以前从未听说过这个,也不了解这条规则背后的原因。有状态的EJB可能是我的问题的替代品,但这对我的口味来说太重了。

1 个答案:

答案 0 :(得分:3)

这一段实际上只是对EJB的最小Java 2安全策略的粗略重述(EJB 3.2规范的第16.3节)。规范并不保证您的EJB将具有执行其操作的权限。如果您的应用程序服务器中没有启用Java 2安全性,或者您已授予EJB执行权限,那么您应该没问题。 (当然,检查/更改您不拥有的对象状态的常规警告仍然适用。)

如果您想要避免警告,那么另一种方法可能是创建工厂界面:

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

...而是将其传递给EJB。我没有任何其他好主意。