java - 为什么我在运行时使用 jre websphere 而不是正常工作的正常 jre 1.7 时会遇到此问题?

标签 java websphere

我正在使用 JPA,并且我有一个在 n 个方案上重复的表。该查询是用 jpql 编写的,我需要根据需要指定不同的方案,以避免创建重复的代码。更准确地说,我想更改注释 @Table (name = "nameofTable", schema = "nameofSchema") 的 nameOfSchema 值 在运行时然后执行查询。对此我写了下面的方法。使用普通 JRE 1.7 运行时,它可以正常工作,但是当我使用 websphere JRE 1.7 运行该方法时,出现运行时错误。

`public void changeTableSchema(final String schema,Class<?> entityWithTable) throws Exception {
    try {
        final String ANNOTATIONS = "annotations";
        Table anntotationToChange = entityWithTable.getAnnotation(Table.class);
        final Table anntotationToChangeCopy = anntotationToChange;
        anntotationToChange = new Table() {
            @Override
            public Class<? extends Annotation> annotationType() {
                return anntotationToChangeCopy.annotationType();
            }

            @Override
            public UniqueConstraint[] uniqueConstraints() {
                return anntotationToChangeCopy.uniqueConstraints();
            }

            @Override
            public String schema() {
                return schema;
            }

            @Override
            public String name() {
                return anntotationToChangeCopy.name();
            }

            @Override
            public String catalog() {
                return anntotationToChangeCopy.catalog();
            }
        };
        Field annotations = Class.class.getDeclaredField(ANNOTATIONS);
        annotations.setAccessible(true);
        Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations
                .get(entityWithTable.class);
        map.put(Table.class, anntotationToChange);
    } catch (Exception e) {
        e.printStackTrace();
    }
} `

The error is:
java.lang.NoSuchFieldException: annotations at java.lang.Class.getDeclaredFieldImpl(Native Method) at java.lang.Class.getDeclaredField(Class.java:720) at it.solarisistemi.awondo.be.web.Prova.changeTableSchema(Prova.java:106) at it.solarisistemi.awondo.be.web.Prova.main(Prova.java:23)

最佳答案

出现此错误的原因是因为您侵入了java.lang.Class实现中的不可见字段,并且Java类的实现可能会根据不同的JDK发行版而有所不同(例如 Oracle 与 IBM JDK 与 OpenJDK)。

更重要的是,这些内部字段可能会在同一供应商的 JDK 版本(例如 IBM JDK 7 到 IBM JDK 8)之间更改或消失,恕不另行通知,因为它们从未打算公开访问。

我会推荐以下解决方案之一,而不是侵入注释值:

  1. 在数据库端设置表别名
  2. 使用 @Table.name() 的新值重新编译必要的应用程序类

关于java - 为什么我在运行时使用 jre websphere 而不是正常工作的正常 jre 1.7 时会遇到此问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173652/

相关文章:

java - 如何分割 "^A"字符

java - 如何从 String2 中删除 String1 并用剩余的字符串构建新的 String2?

java - 如何从 Eclipse 中的动态 Web 项目构建 EAR 文件?

java - 是 8.5.5。 Web 应用程序在启动期间出现 NoSuchFieldError

java - 在本地主机上运行的 HTTPS Web 服务调用在测试环境中失败,异常为 : javax.net.ssl.SSLException: SSLSocketFactory is null

java - 如何停止 MediaPlayer 流然后重新启动它?安卓

java - 尝试绑定(bind) dbcp 的 BasicDataSource 时出现 javax.naming.OperationNotSupportedException

jakarta-ee - 当 LTPA token 过期时,WebSphere 8.5.5 上的 UnauthorizedSessionRequestException 与 vaadin Web 应用程序

spring - WebSphere 7 中的 Spring 依赖注入(inject)(JSR 330 注释)不起作用

java - 从 PostgreSQL 创建 XML?