我在引擎盖下使用Immutables + Jackson进行以下POJO:
@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而不是手动键入字符串。
请注意,手工编写getter很好,因为我可以轻松地进行重构,并且可以对编译器进行双重检查,但是对于字符串,我担心下层人士,我想从POJO中“读取”它们上课。
答案 0 :(得分:2)
您可以通过反射来完成。您需要采用用 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