Question

Avec le code source Java généré, comme

  • code généré avec des outils Hibernate
  • code généré avec la liaison schéma JAXB (xjc)
  • code généré avec WDSL2Java (cxf)

toutes les classes générées sont des types « d'objets de valeur », sans logique métier. Et si j'ajoute des méthodes au code source généré, je perdrai ces méthodes si je répète la génération de code source.

Est-ce que ces outils code Java génération offrent des moyens de "étendre" le code généré?

Par exemple,

  • pour remplacer la méthode ToString (pour l'enregistrement)
  • pour mettre en œuvre le modèle des visiteurs (pour l'analyse des données / validation)
Était-ce utile?

La solution

Pour JAXB, voir Ajout Behaviors.

En fait, vous configurez JAXB pour retourner une instance personnalisée de l'objet que vous auriez normalement attendre. Dans l'exemple ci-dessous vous créez un nouvel objet PersonEx qui étend la personne objet JAXB. Ce mécanisme fonctionne bien dans ce que vous dériver des classes générées, et ne pas modifier les classes JAXB ou schémas du tout.

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();
  }
}

Notez que la directive @Override est important dans le cas où vos changements d'objet JAXB -. Il empêchera votre personnalisation devenir devenus orphelins

Autres conseils

Pour ce Hibernate vous pouvez modifier les fichiers de modèles utilisés dans la génération de code pour modifier leur comportement. Si vous souhaitez modifier les outils de mise en veille prolongée, vous pouvez modifier, par exemple: dao / daohome.ftl

Vous pouvez même ajouter des champs à la sortie "toString ()" l'édition du .hbm.xml fichiers

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

Les deux pour l'enregistrement et la validation, vous pouvez envisager d'utiliser AOP avec AspectJ (je ne sais pas recommander déconner avec le code généré, puisque vous pouvez construire à partir de zéro que de nombreuses fois).

D'abord, je répète que la modification du code généré a de nombreux problèmes qui y sont associés et que, lorsque cela est possible, il doit être évité. Cela dit parfois cela est impossible d'éviter ou plus d'efforts que de faire face aux changements lorsque le code est régénéré.

Malheureusement java ne supporte pas le concept de classes partielles c # a. Ce sont précisément pour résoudre ce genre de problème.

Vous devriez voir si vos outils de génération de code prennent en charge une certaine forme de commentaires significatifs qui délimitent les régions ajoutées par vous-même dans la classe (ce qui est peu probable et ne sera pas utile si vous modifiez le code plutôt que d'ajouter à elle)

meilleure option si vous voulez vraiment faire est de générer les fichiers au départ, mais les vérifier dans un référentiel de contrôle de version immédiatement. Ensuite, apportez vos modifications, vérifiez que.

La prochaine fois que vous exécutez à nouveau les outils et les laisser écraser les fichiers existants, vous pouvez diff contre ceux qui vous sont contrôlées source et fusionner les modifications de nouveau (changements les plus triviales comme ajout de nouvelles colonnes / tables seront peu d'effort.

Cela ne vous aidera pas autant si le générateur de code génère soudainement radicalement différent code (par exemple une nouvelle version), mais dans les cas de code que vous avez ajouté qui était non seulement des méthodes pratiques supplémentaires reposant sur des données / méthodes déjà exposées publiquement) aura des problèmes, peu importe la façon dont il est mélangé dans la classe. Le système de contrôle de version ne permet cependant encore puisqu'il enregistre également les changements d'origine afin que vous puissiez voir ce que vous aviez ajouté précédemment et ce, on peut supposer, vous devez recréer dans le nouveau style.

Il est pas une bonne idée de modifier les fichiers de code générés, soit en éditant les fichiers eux-mêmes ou par sous-classement. Quoi que vous fassiez, assurez-vous de laisser la signature créée par l'outil intact, de sorte qu'il sera possible de comprendre à l'avenir que le fichier a été généré automatiquement.

Je vous recommande la recherche des options de commande des outils pour voir si elles vous permettent une certaine flexibilité. Certains outils peuvent générer des classes abstraites ou des interfaces plutôt que des classes concrètes. Si cela est impossible, créer un objet de domaine qui inclut l'objet autogenerated comme une variable membre.

La façon dont je l'ai utilisé Hibernate est de générer des classes de base que je Prolongez ensuite. J'ajoute toute ma logique métier (le cas échéant) à ces sous-classes. Je assez souvent finissent aussi changer les modèles de FreeMarker utilisés par Hibernate pour personnaliser davantage les classes générées.

La citation AOP est un bon. Je vais ajouter Spring, qui a de très belles caractéristiques AOP intégrées.

Jetez un oeil à

http://code.google.com/p/jaxb-method-inserter /

Son un petit plugin pour JAXB je l'ai écrit, Son assez simple à des utilisations. Espérons que cela aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top