[JAVA] Synthétiser les annotations Spring pour créer des stéréotypes spécifiques au projet

Normalement, Java ne peut pas hériter ou synthétiser les annotations, mais les annotations Spring sont possibles. Aucune préparation compliquée n'est requise, il suffit d'écrire une annotation.

De base

Définissez une annotation et ajoutez l'annotation que vous souhaitez synthétiser à ce type. En ce qui concerne les paramètres de l'annotation d'origine, s'il s'agit d'une constante, vous pouvez la spécifier comme d'habitude, ou vous pouvez utiliser @ AliasFor pour transmettre les paramètres de la nouvelle annotation à l'annotation synthétisée.

@Retention(RetentionPolicy.RUNTIME) //Rendre les annotations visibles au moment de l'exécution
@Validated
@ModelAttribute(binding = true)
public @interface ValidModel {
  @AliasFor(annotation = ModelAttribute.class, 	attribute = "name")
  String value() default "";
}

Les annotations synthétiques sont utilisées partout, telles que @ SpringBootApplication et @ GetMapping, donc si vous suivez la source, vous pouvez comprendre comment l'utiliser.

Annuler la transaction lorsqu'une exception cochée se produit

Par défaut, «@ Transactional» a le comportement horrible d'être validé même si une exception vérifiée est levée, mais en définissant votre propre annotation, vous n'avez pas à ajouter «rollbackFor» à chaque fois.

@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor = Exception.class)
public @interface OurTransactional {
  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}

Lancer une exception si DAO ou Repository est appelé en dehors de la transaction

Je ne pense pas que DAO sera une limite de transaction, mais vous pouvez également vérifier si elle se trouve dans une transaction avec une annotation comme indiqué ci-dessous.

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Component
@Transactional(propagation = Propagation.MANDATORY)
public @interface OurDao {
  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}

Faire du contrôleur une limite de transaction

Une annotation qui coupe une transaction avec un contrôleur comme la série Play 1 est comme ça.

@Retention(RetentionPolicy.RUNTIME)
@Controller
@RequestMapping
@Transactional
public @interface OurController {
  @AliasFor(annotation = RequestMapping.class, attribute = "path")
  String value() default "";

  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}

Recommended Posts

Synthétiser les annotations Spring pour créer des stéréotypes spécifiques au projet
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
Comment créer docker-compose
Créez une API pour envoyer et recevoir des données Json avec Spring