gpt4 book ai didi

java - 使用 Jackson 2 的动态属性过滤器

转载 作者:行者123 更新时间:2023-11-30 08:26:46 24 4
gpt4 key购买 nike

我正在构建一个 REST 服务平台,我们必须在其中支持以下查询模式:

  1. format=summary 这意味着我们必须只反序列化用我们的自定义注释 @Summary
  2. 注释的 POJO 属性
  3. format=detail 这意味着我们必须只反序列化用我们的自定义注释 @Detail
  4. 注释的 POJO 属性
  5. fields=prop1,prop2,prop3 这意味着我们必须反序列化查询中提供的 POJO 属性。

我正在使用 Jackson 2 (v2.3.0) 我尝试了以下操作:

  • 开发自定义注释(@Summary@Detail)
  • 开发了一个 JsonFilter(代码如下所示)并将 @JsonFilter 注释到我的 POJO 类。

Location.java

@JsonFilter("customFilter")
public class Location implements Serializable {
@Summary
@Detail
private String id;

@Summary
@Detail
private String name;

@Summary
@Detail
private Address address;

// ... getters n setters

Address.java

@JsonFilter("customFilter")
public class Address implements Serializable {

@Detail
private String addressLine1;

@Detail
private String addressLine2;

@Detail
private String addressLine3;

@Detail
@Summary
private String city;

@Summary
@Detail
private String postalCode;

// ... getters n setters

CustomFilter.java

public class CustomFilter extends SimpleBeanPropertyFilter {
@Override
protected boolean include(BeanPropertyWriter propertyWriter) {
if(logger.isDebugEnabled()) {
logger.debug("include(BeanPropertyWriter) method called..");
}

return this.deserialize(propertyWriter);
}

@Override
protected boolean include(PropertyWriter propertyWriter) {
if(logger.isDebugEnabled()) {
logger.debug("include(PropertyWriter) method called..");
}

return this.deserialize((BeanPropertyWriter) propertyWriter);
}

private boolean deserialize(final BeanPropertyWriter beanPropertyWriter) {
final String format = (String) AppContext.get("format");

if(StringUtils.isNotBlank(format)) {
return deserializeForAnnotation(format, beanPropertyWriter);
} else {
@SuppressWarnings("unchecked")
final Set<String> fieldNames = (Set<String>) AppContext.get("fieldNames");
if(null != fieldNames && !fieldNames.isEmpty()) {
final String serializedPropertyName = beanPropertyWriter.getSerializedName().getValue();
return fieldNames.contains(serializedPropertyName);
}
}

return false;
}

private boolean deserializeForAnnotation(final String format, final BeanPropertyWriter beanPropertyWriter) {

if(StringUtils.equalsIgnoreCase(format, "detail")) {
return (null != beanPropertyWriter.getAnnotation(Detail.class));
} else if(StringUtils.equalsIgnoreCase(format, "summary")) {
return (null != beanPropertyWriter.getAnnotation(Summary.class));
}

return false;
}
}

我得到了带有注释的预期结果,但是我支持属性名称过滤的第三个要求不起作用。

有人可以帮忙吗?如果可能的话,举一些例子?

最佳答案

我写了一个名为 Squiggly Filter 的库,它根据 Facebook Graph API 语法的子集选择字段。例如,要选择用户对象地址字段的邮政编码,您可以使用查询字符串 ?fields=address{zipCode}。 Squiggly Filter 的优点之一是,只要您有权访问呈现 json 的 ObjectMapper,就不必修改任何 Controller 方法的代码。

假设您正在使用 servlet API,您可以执行以下操作:

1) 注册一个过滤器

<filter> 
<filter-name>squigglyFilter</filter-name>
<filter-class>com.github.bohnman.squiggly.web.SquigglyRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>squigglyFilter</filter-name>
<url-pattern>/**</url-pattern>
</filter-mapping>

2) 初始化ObjectMapper

Squiggly.init(objectMapper, new RequestSquigglyContextProvider());

3) 你现在可以过滤你的 json

curl https://yourhost/path/to/endpoint?fields=field1,field2{nested1,nested2}

您也可以根据注释选择字段。

有关 Squiggly Filter 的更多信息,请访问 github .

关于java - 使用 Jackson 2 的动态属性过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com