Using a HashMap in a custom Annotation

Introduction

There may be a requirement to define key-value pairs in an annotation in order to perform a mapping based on keys or/and values.

In this case a HashMap would be the first choice. However, annotations do not support the type HashMap. A HashMap can be used with the Enum type, which is supported by annotations.

List of supported Types in Annotations

In my article “Creating a custom Jackson JsonSerializer and JsonDeserializer for mapping values“, I create the custom annotation @MappingTable to use key-value pairs for bidirectional mapping in a custom JsonSerializer and JsonDeserializer.

Enum Constant

The Maps enumeration type contains the constant SALUTATION_MAP. The HashMaps are defined in these constants using Map.of(). Alternatively, new HashMap<>() can be used.

import java.util.Map;

public enum Maps {

    SALUTATION_MAP(Map.of("1", "MALE", "2", "FEMALE", "6", "DIVERS"));

    private final Map<String, String> map;

    Maps(Map<String, String> map) {
        this.map = map;
    }

    public Map<String, String> getMap() {
        return this.map;
    }
}

Enter fullscreen mode Exit fullscreen mode

Custom Annotation @MapItems

The enumeration type Maps is set as the type in the annotation.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MapItems {

    Maps map();
}

Enter fullscreen mode Exit fullscreen mode

Functional Test

The enum constants are referenced in the @MapItems annotation.

class ExampleDto {

    @MapItems(map = Maps.SALUTATION_MAP)
    public String salutation;
}

Enter fullscreen mode Exit fullscreen mode

The MapItemsTest tests the MapItems annotation. The test is done on the salutation field.

class MapItemsTest {

    @Test
    void testEnumConstants() throws NoSuchFieldException {
        Field field = ExampleDto.class.getDeclaredField("salutation");
        field.setAccessible(true);

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

        assertSame(Maps.SALUTATION_MAP.getMap(), annotation.map().getMap());
    }
}

Enter fullscreen mode Exit fullscreen mode

Conclusion

Pro

  • Simple implementation
  • Reuse of the HashMap, for example, when validating a property of a payload, validating fields in a DTO or collecting key-value pairs in a response.

Contra

Full example

https://github.com/alaugks/article-annotation-key-value-pairs

原文链接:Using a HashMap in a custom Annotation

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容