DEV Community

André Laugks
André Laugks

Posted on • Edited on

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

Image of Docusign

Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs