以下代码是否违反了EJB 3规范?如果是这样,我该怎么做才能保留所需的功能?
我问的原因是IntelliJ 14产生了这些警告:
我想要实例化的类不是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可能是我的问题的替代品,但这对我的口味来说太重了。
答案 0 :(得分:3)
这一段实际上只是对EJB的最小Java 2安全策略的粗略重述(EJB 3.2规范的第16.3节)。规范并不保证您的EJB将具有执行其操作的权限。如果您的应用程序服务器中没有启用Java 2安全性,或者您已授予EJB执行权限,那么您应该没问题。 (当然,检查/更改您不拥有的对象状态的常规警告仍然适用。)
如果您想要避免警告,那么另一种方法可能是创建工厂界面:
interface AbstractSomeClassFactory<T> { T create(MyArgument a); }
...而是将其传递给EJB。我没有任何其他好主意。