Программный доступ к @JsonProperty из Java - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий POJO с использованием Immutables + Jackson под капотом:

@JsonInclude(JsonInclude.Include.NON_NULL)
abstract class AbstractQueryRequest {
    @JsonProperty("reqid")
    public abstract String reqid();

    @JsonProperty("rawquery")
    public abstract String rawquery();
}

В какой-то момент мне нужно построить еще один объект на основе полей POJO, что-то вроде этой линии:

    final HttpUrl.Builder urlBuilder = HttpUrl.parse(cfg.baseUrl()).newBuilder();
    urlBuilder.addQueryParameter("reqid", request.reqid())
            .addQueryParameter("rawquery", request.rawquery());

Довольно неудобно держать POJO, и этот вызов выровнен по изменениям, мне было интересно, можно ли было программно получить доступ к каждому JsonProperty вместо того, чтобы вводить строку вручную.

Обратите внимание, что это нормальнонаписать геттеры вручную, так как я могу легко выполнить рефакторинг, и у меня есть двойная проверка компилятора, но за строки я беспокоюсь о людях, идущих дальше, и я хотел бы как-то «прочитать» их из класса POJO.

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете сделать это с помощью отражения.Вам нужно взять значения аннотации метода, которые отмечены JsonProperty .Но я рекомендую вам использовать JsonProperty для полей, а не для методов.

Вот пример для вашего текущего требования:

public class Main {
    public static void main(String[] args) {

        AbstractQueryRequest someType = new SomeType();

        for(Method method : x.getClass().getSuperclass().getDeclaredMethods()) {
            if (method.isAnnotationPresent(JsonProperty.class)) {
                JsonProperty annotation = method.getAnnotation(JsonProperty.class);
                System.out.println(annotation.value());
            }
        }
    }
}


class SomeType extends AbstractQueryRequest {

    @Override
    public String reqid() {
        return null;
    }

    @Override
    public String rawquery() {
        return null;
    }
}

Вывод:

rawquery
reqid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...