Automati c обнаружение геттеров без префикса get - PullRequest
1 голос
/ 03 февраля 2020

Возможно ли, чтобы Джексон автоматически обнаруживал получатели, которые не названы, используя схему именования getFoo(), но вместо этого просто именуются foo()?

Пример:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

class Test {
    private final String foo;

    public Test(String foo) {
        this.foo = foo;
    }

    public String foo() {
        return foo;
    }
}

class Scratch {
    public static void main(String[] args) throws JsonProcessingException {
        final ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(new Test("example")));
    }
}

Здесь геттер foo() не распознается Джексоном. Одним из решений в этом случае было бы аннотировать геттер с помощью @JsonProperty. Однако я ищу способ сделать это без необходимости аннотировать каждый отдельный получатель вручную.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Возможно переопределить обработку аннотаций, как если бы оценщики без префикса get рассматривали так же, как аннотированные как получатели.

mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
    @Override
    public PropertyName findNameForSerialization(Annotated a) {
        PropertyName result = super.findNameForSerialization(a);
        if (result == null) {
            final AnnotatedElement classMember = a.getAnnotated();
            if (classMember instanceof Method) {
                final Method method = (Method) classMember;
                if (method.getParameterCount() == 0 && (method.getModifiers() & (Modifier.STATIC | Modifier.ABSTRACT)) == 0)
                    try {
                        final Field field = method.getDeclaringClass().getDeclaredField(method.getName());
                        if (field.getType().equals(method.getReturnType())
                                && (field.getModifiers() & Modifier.STATIC) == 0
                        ) {
                            result = new PropertyName(field.getName());
                        }
                    } catch (NoSuchFieldException e) {
                        // ignore
                    }
            }
        }
        return result;
    }
});
0 голосов
/ 03 февраля 2020

невыполнима; единственный распознаваемый аспект здесь (потому что «углубляться в байт-код и проверять, просто ли оно возвращает поле», это определенно недопустимо, так как это внутренние детали, которые могут измениться в незначительных обновлениях, и, следовательно, запретить) «любой метод, который не имеет параметров, не является static и возвращает что-то другое, чем void) .. но другие методы могут сделать это тоже. Например, строковое значение toLowerCase(), которое определенно не является геттером ни в каком виде или форме.

Итак, даже не имея представления о возможностях Джексона, то, о чем вы просите, буквально совершенно невозможно. Это какой-то заранее установленный шаблон имени (например, getX), аннотация или явный список. Других вариантов нет.

...