@Override
    @Nullable
    public <T> ParamConverter<T> getConverter(Class<T> rawType, @Nullable Type genericType, Annotation[] annotations) {
        if (!rawType.isEnum()) {
            return null;
        }

        @SuppressWarnings("unchecked") final Class<Enum<?>> type = (Class<Enum<?>>) rawType;
        final Enum<?>[] constants = type.getEnumConstants();
        final String parameterName = getParameterNameFromAnnotations(annotations).orElse("Parameter");
        final Method fromStringMethod = AccessController.doPrivileged(ReflectionHelper.getFromStringStringMethodPA(rawType));

        return new FuzzyEnumParamConverter<>(rawType, fromStringMethod, constants, parameterName);
    }
@Test
    void testFuzzyEnum() {
        final ParamConverter<Fuzzy> converter = getConverter(Fuzzy.class);
        assertThat(converter.fromString(null)).isNull();
        assertThat(converter.fromString("A.1")).isSameAs(Fuzzy.A_1);
        assertThat(converter.fromString("A-1")).isSameAs(Fuzzy.A_1);
        assertThat(converter.fromString("A_1")).isSameAs(Fuzzy.A_1);
        assertThat(converter.fromString(" A_1")).isSameAs(Fuzzy.A_1);
        assertThat(converter.fromString("A_1 ")).isSameAs(Fuzzy.A_1);
        assertThat(converter.fromString("A_2")).isSameAs(Fuzzy.A_2);

        assertThatExceptionOfType(WebApplicationException.class)
            .isThrownBy(() -> converter.fromString("B"))
            .matches(e -> e.getResponse().getStatus() == 400)
            .extracting(Throwable::getMessage)
            .matches(msg -> msg.contains("A_1"))
            .matches(msg -> msg.contains("A_2"));
    }