Почему я получаю эту проблему во время выполнения с jre websphere вместо этого с нормальным jre 1.7, работающим должным образом? - PullRequest
2 голосов
/ 15 марта 2019

Я работаю с JPA, и у меня есть таблица, которая повторяется по схеме n.Запрос написан с использованием jpql, и мне нужно указать другую схему, основанную на необходимости избегать создания дублированного кода.Точнее, я хочу изменить значение nameOfSchema аннотации @Table (name = "nameofTable", schema = "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();
    }
} `

Ошибка:
java.lang.NoSuchFieldException: аннотации в java.lang.Class.getDeclaredFieldImpl (собственный метод) в java.lang.Class.getDeclaredField (Class.java: 720) в it.solarisistemi.awondo.be.web.Prova.changeTableSchema (Prova.java:106) в it.solarisistemi.awondo.be.web.Prova.main (Prova.java:23)

1 Ответ

2 голосов
/ 15 марта 2019

Причина этой ошибки заключается в том, что вы взламываете невидимое поле в реализации java.lang.Class, и реализации классов Java могут различаться в зависимости от различных распределений JDK (например, Oracle против IBM JDK против OpenJDK).

Что еще более важно, эти внутренние поля могут изменяться или исчезать между версиями JDK одного и того же поставщика (например, от IBM JDK 7 до IBM JDK 8) без предварительного уведомления, поскольку они никогда не предназначались для публичного доступа.

Я бы рекомендовал одно из следующих решений вместо взлома значений аннотаций:

  1. настройка псевдонима таблицы на стороне БД
  2. повторная компиляция необходимого приложенияклассы с новыми значениями для @Table.name()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...