Как я могу расширить код Java, сгенерированный JAXB, инструментами CXF или Hibernate?

Чтобы обновить определенное значение в файле json, вы можете сделать это следующим образом:

Сначала возьмите свой original json в строку:

  String jsonString ="{
  "females": [
    {
      "id": 1,
      "name": "Name One",
      "actions": [
        {
          "action_1": 1,
          "action_2": 2,
          "action_3": 3
        }
      ]
    }
  ]
}";

Далее, передайте эту строку в [113 ]:

   JSONObject jObject  = new JSONObject(jsonString);//passing string to jsonobject
         JSONArray jsonArray = jObject.getJSONArray("females");
        for (int i = 0; i < jsonArray.length(); i++) {
         JSONObject object = jsonArray.getJSONObject(i);
         JSONArray jsonObject= object.getJSONArray("actions"); //getting action 
array
       for (int j = 0; j < jsonObject.length(); j++) {
         JSONObject object1 = jsonObject.getJSONObject(j);

           object1.put("action_1", 123); //here you are putting value to action_1
                    object1.put("action_2", 456);
                    object1.put("action_3", 789);
        }
        } 

, а затем отправьте это jsonObject на ваш сервер.

18
задан mjn 23 April 2009 в 11:55
поделиться

6 ответов

Для JAXB см. Добавление поведения .

По сути, вы конфигурируете JAXB для возврата пользовательского экземпляра объекта, который вы обычно ожидаете. В приведенном ниже примере вы создаете новый объект PersonEx, который расширяет объект JAXB Person. Этот механизм хорошо работает в том смысле, что вы наследуете сгенерированные классы, а не изменяете классы или схемы JAXB вообще.

package org.acme.foo.impl;

class PersonEx extends Person {
  @Override
  public void setName(String name) {
    if(name.length()<3) throw new IllegalArgumentException();
    super.setName(name);
  }
}

@XmlRegistry
class ObjectFactoryEx extends ObjectFactory {
  @Override
  Person createPerson() {
    return new PersonEx();
  }
}

Обратите внимание, что директива @Override важна в случае изменения вашего объекта JAXB - это предотвратит превращение вашей настройки сиротами .

15
ответ дан 30 November 2019 в 07:34
поделиться

Что касается Hibernate, вы можете настроить файлы шаблонов, используемые при генерации кода, чтобы изменить их поведение. Если вы хотите настроить HIbernate Tools, вы можете отредактировать, например: dao / daohome.ftl

Вы можете даже добавить поля в вывод «toString ()», отредактировав .hbm.xml files

...
<property name="note" type="string">
    <meta attribute="use-in-tostring">true</meta>
    <column name="note" />
</property>
...

Как для регистрации, так и для проверки вы можете рассмотреть возможность использования AOP с AspectJ (я не рекомендую возиться с сгенерированным кодом, так как вам может понадобиться многократно создавать его с нуля).

8
ответ дан 30 November 2019 в 07:34
поделиться

Сначала я хотел бы повторить, что с модификацией сгенерированного кода связано много проблем, и что, по возможности, этого следует избегать. Тем не менее, иногда это нецелесообразно избегать или требовать больших усилий, чем просто иметь дело с изменениями при регенерации кода.

К сожалению, java не поддерживает концепцию частичных классов, которая есть в c #. Это как раз для решения такого рода проблем.

Вы должны увидеть, поддерживают ли ваши инструменты генерации кода какую-либо форму значимых комментариев, которые разграничивают области, добавленные вами самими в классе (это маловероятно и не поможет, если вы изменяете код, а не добавление к нему)

Если вы действительно хотите это сделать, лучше всего сначала создать файлы, но сразу же зарегистрировать их в репозитории контроля версий. Затем внесите изменения, отметьте это.

В следующий раз вы перезапустите инструменты и дадите им перезаписать существующие файлы, которые вы можете сравнить с вашими исходными файлами, и объединить изменения обратно (большинство тривиальных изменений, таких как добавление новых столбцов / таблиц). это потребует мало усилий.

Это не поможет вам так сильно, если генератор кода внезапно сгенерирует совершенно другой код (скажем, новую версию), но в этих случаях любой код, который вы добавили, не был просто дополнительными вспомогательными методами, основанными на данных / методы, уже открытые для общественности) будут иметь проблемы независимо от того, как они смешиваются в классе. Однако система управления версиями все еще помогает, поскольку она также записывает исходные изменения , чтобы вы могли видеть, что вы добавили ранее, и что, как можно предположить, вам нужно воссоздать в новом стиле.

4
ответ дан 30 November 2019 в 07:34
поделиться

Не рекомендуется редактировать сгенерированные файлы кода, редактируя сами файлы или создавая подклассы. Что бы вы ни делали, обязательно оставьте подпись, созданную инструментом, нетронутой, чтобы в будущем можно было понять, что файл был сгенерирован автоматически.

Я рекомендую вам изучить параметры команды инструментов, чтобы посмотрим, позволяют ли они вам некоторую гибкость. Некоторые инструменты могут генерировать абстрактные классы или интерфейсы вместо конкретных классов. Если это невозможно, создайте объект домена, который включает автоматически созданный объект в качестве переменной-члена.

3
ответ дан 30 November 2019 в 07:34
поделиться

Я использовал Hibernate для создания базовых классов, которые я затем расширяю. Я добавляю всю свою бизнес-логику (если есть) к этим подклассам. Я часто заканчиваю тем, что меняю шаблоны FreeMarker, используемые Hibernate, для дальнейшей настройки сгенерированных классов.

3
ответ дан 30 November 2019 в 07:34
поделиться

Хорошая цитата из АОП. Я добавлю Spring, который имеет очень хорошие встроенные функции AOP.

1
ответ дан 30 November 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: