java - 无法使用反射从 EJB 内的 Field 转换为 EntityManager

标签 java casting

我想通过反射在 EJB 中动态获取 EntityManager。我有这个代码:

    @Stateful
    @Local(ContextLocal.class)
    public class ContextBean implements ContextLocal {

    @PersistenceContext(unitName="00")
    private EntityManager emBeta;

    @PersistenceContext(unitName="01")
    private EntityManager emPretoria;

    private static Logger logger = Logger.getLogger(ContextBean.class);

    public ContextBean() {}

    @Override
    public void createAccount(String pseudo, char[] password, String email, TemperamentEnum temperament, Universe universe, int galaxie, int solarSystem, int position) throws PSQLException {

        // Récupération de l'EntityManager adequat en fonction de l'univers choisi
        EntityManager em = getEmFromUniverse(universe);

    }

    /**
     * retourne un EntityManager en fonction d'un univers donné
     * 
     * @param universe
     * 
     * @return EntityManager
     */
    private EntityManager getEmFromUniverse(Universe universe){

        EntityManager em = null;

        try {

            Field[] fields = Class.forName(getClass().getPackage() + "ContextBean").getDeclaredFields();

            for(Field field : fields){
                if(!field.getType().equals(EntityManager.class))
                    continue;
                if(field.getName().replaceFirst("^em", "").equalsIgnoreCase(universe.getName()))
                    return (EntityManager)field; // ERROR HERE
            }

        } catch (SecurityException e) {
            logger.log(Level.FATAL, e);
        } catch (ClassNotFoundException e) {
            logger.log(Level.FATAL, e);
        }

        return em;      
    }

}

我无法将 Field 转换为 EntityManager :

Cannot cast from Field to EntityManager

如何将 Field 转换为 EntityManager 对象?

编辑:

我可以通过执行 universe.getName() 获得我的 universe 对象的名称,我将获得 betapretoria .

我知道我可以使用 getter 来检索正确的 EM :

if(universe.getName().equals("beta"))
   return emBeta;
else
   ...

但是我的 EJB 中的 EM 数量可能会增加。因此,通过反射,代码会更慢(但每个用户在注册时只会使用一次),但当我添加新的 EM 时,我不必更改它。这就是为什么我不使用 setter/getter 。

在我的例子中使用反射有什么缺点吗?

编辑2:

我检索到的 EM 的交易完整性会丢失吗?

最佳答案

您应该提供包含您需要获取的字段的对象:

boolean isAccessible = field.isAccessible();
try {
    field.setAccessible(true);
    return field.get(this); // <-- pass object instance here
} finally {
    field.setAccessible(isAccessible);
}

关于java - 无法使用反射从 EJB 内的 Field 转换为 EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956592/

相关文章:

java - 如何设计一个可以处理两种不同对象类型的方法

java - 在Java的帮助下爬行网页以获取与关键字相关的有意义内容的最佳方法是什么?

c# - 尝试返回 IQueryable<MyType> 时出现转换错误

c# - 如何在 C# 中从 System.Array 转换为 object[]

java - 从不同的方法写入同一个文件

java - 如何制作不需要任何人下载任何东西的软件

java - Mercurial v Git v 颠覆

将 char[][] 转换为 char** 会导致段错误?

c++ - 如何将 void* 转换回 std::vector<float>

c# - 如何在 C# 中转换存储在 session 中的字典?