gpt4 book ai didi

jakarta-ee - EJB 中的类实例化

转载 作者:行者123 更新时间:2023-12-03 11:26:46 25 4
gpt4 key购买 nike

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

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

  • EJB 中不允许使用“java.lang.reflect.Constructor”
  • 不允许使用“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 规范中有一个部分回答了我的问题的第一部分:

    The enterprise bean must not attempt to query a class to obtain information about the declared members that are not otherwise accessible to the enterprise bean because of the security rules of the Java language. The enterprise bean must not attempt to use the Reflection API to access information that the security rules of the Java programming language make unavailable.



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

    最佳答案

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

    如果您想避免警告,那么另一种方法可能是创建一个工厂接口(interface):

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

    ...并将其传递给 EJB。我没有其他好主意。

    关于jakarta-ee - EJB 中的类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34874099/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com