Maison >Java >javaDidacticiel >Utilisation d'annotations imbriquées pour les paires clé-valeur dans une annotation personnalisée

Utilisation d'annotations imbriquées pour les paires clé-valeur dans une annotation personnalisée

Susan Sarandon
Susan Sarandonoriginal
2025-01-20 04:04:10403parcourir

Using nested annotations for key-value pairs in a custom annotation

Présentation

Dans mon article précédent "Utilisation de HashMap dans les annotations personnalisées", j'ai expliqué comment utiliser HashMap dans les annotations à l'aide de constantes d'énumération.

Les annotations imbriquées peuvent également être utilisées pour mapper des paires clé-valeur.

Liste des types pris en charge dans les annotations

Annotations

Nécessite deux annotations personnalisées. La première annotation (telle que MapItem) contient une paire clé-valeur et la deuxième annotation (telle que MapItems) contient une liste d'annotations MapItem.

Annotation personnalisée @MapItem

L'annotation @MapItem représente une seule paire clé-valeur.

<code class="language-java">@Target(ElementType.FIELD)
public @interface MapItem {

    String key();
    String value();
}</code>

Annotation personnalisée @MapItems

L'annotation @MapItems définit une liste MapItem.

<code class="language-java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MapItems {

    MapItem[] items();
}</code>

Tests fonctionnels

La liste d'annotations @MapItem est définie dans l'annotation @MapItems.

<code class="language-java">class ExampleDto {

    @MapItems(items = {
        @MapItem(key = "1", value = "MALE"),
        @MapItem(key = "2", value = "FEMALE"),
        @MapItem(key = "6", value = "DIVERS")
    })
    public String salutation;
}</code>

MapItemsTest teste les annotations MapItems. Le test est effectué sur le champ de salutation.

Pour montrer comment utiliser une liste @MapItem, je crée un HashMap à partir du @MapItem et je le compare au HashMap attendu.

<code class="language-java">class MapItemsTest {

    @Test
    void testMapItems() throws NoSuchFieldException {

        Field field = ExampleDto.class.getDeclaredField("salutation");
        field.setAccessible(true);

        MapItems annotation = field.getAnnotation(MapItems.class);

        Map<String, String> mappingItems = Arrays
                .stream(annotation.items())
                .collect(
                    Collectors.toMap(
                        MapItem::key,
                        MapItem::value
                    )
                );

        assertEquals(
            new HashMap<>() {{
                put("1", "MALE");
                put("2", "FEMALE");
                put("6", "DIVERS");
            }},
            mappingItems
        );
    }
}</code>

Conclusion

Avantages

C'est une solution intéressante et facile à mettre en œuvre.

Inconvénients

Par exemple, si des paires clé-valeur doivent être utilisées dans un validateur, elles doivent être obtenues indirectement.

Exemple complet

https://www.php.cn/link/164710e8521a5b39302f816392f05bc2

Articles connexes

  • Utiliser HashMap dans les annotations personnalisées
  • Créez Jackson JsonSerializer et JsonDeserializer personnalisés pour les valeurs mappées

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn