java - 在编组之前动态隐藏一些字段(java到json)
问题描述
我有一个应该返回 JSON 对象的 jax-rs 端点,但我想选择一些字段并隐藏其他一些字段,我的代码是这样的:
import javax.ws.rs.BadRequestException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
@Component
@Path("/customers")
@Api(value = "Customers resource", produces = MediaType.APPLICATION_JSON_VALUE)
public class CustomersEndpoint{
private final CustomersService customersService;
public CustomersEndpoint(CustomersService customersService) {
this.customersService = customersService;
}
@GET
@Path("{customerResourceId}")
@Produces(MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "Get customer details")
@ApiResponses(value = { @ApiResponse(code = 200, message = "Listing the customer details", response = **Customer**.class)") })
public **Customer** getCustomerDetails(@ApiParam(value = "ID of customer to fetch") @PathParam("customerResourceId") String customerId,
@QueryParam(value = "Retrieve only selected fields [by comma]") String fields )
throws ApiException {
return this.customersService.getCustomerDetails(customerId,fields);
}
我的情况是,我只想为选定的字段返回自定义“客户”。
我正在使用 jax-rs,jackson 将对象解组/编组为 JSON。
请提供任何解决方案。
客户类示例:
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Customer {
public Customer() {
}
public Customer(String customerId,String phoneNumber) {
this.customerId=customerId;
this.phoneNumber=phoneNumber;
}
/**
* customer identifier
*/
@JsonPropertyDescription("customer identifier")
@JsonProperty("customerId")
private String customerId;
/**
* customer phone number
*/
@JsonPropertyDescription("customer phone number")
@JsonProperty("phoneNumber")
private String phoneNumber;
/**
* customer first number
*/
@JsonPropertyDescription("customer first number")
@JsonProperty("firstName")
private String firstName;
/**
* customer last number
*/
@JsonPropertyDescription("customer last number")
@JsonProperty("lastName")
private String lastName;
public String getCustomerId() {
return customerId;
}
public Customer setCustomerId(String customerId) {
this.customerId = customerId;
return this;
}
public String getPhoneNumber() {
return phoneNumber;
}
public Customer setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
return this;
}
public String getFirstName() {
return firstName;
}
public Customer setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public String getLastName() {
return lastName;
}
public Customer setLastName(String lastName) {
this.lastName = lastName;
return this;
}
}
输出 :
{
"customerId": "string",
"phoneNumber": "string",
"firstName": "string",
"lastName": "string",
}
=> 选择后的结果:字段 =phoneNumber,customerId
{
"customerId": "string",
"phoneNumber": "string"
}
我知道何时实例化对象并且不设置“隐藏”属性并包含此注释@JsonInclude(JsonInclude.Include.NON_NULL)将是一个解决方案,但它需要太多的代码和维护。
解决方案
我认为您应该向该过滤器添加一个组件:
@Component
public class CustomerFilterConfig {
public static Set<String> fieldNames = new HashSet<String>();
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider().setFailOnUnknownId(false);
FilterProvider filters =simpleFilterProvider.setDefaultFilter(SimpleBeanPropertyFilter.filterOutAllExcept(fieldNames)).addFilter("customerFilter", SimpleBeanPropertyFilter.filterOutAllExcept(fieldNames));
objectMapper.setFilterProvider(filters);
return objectMapper;
}
}
然后在您的模型中添加该过滤器:
@JsonFilter("customerFilter")
public class Customer {...}
最后使用该过滤器:
String fields = "A,B,C,D";
CustomerFilterConfig.fieldNames.clear();
CustomerFilterConfig.fieldNames.addAll(Arrays.asList(fields.split(",")));
推荐阅读
- python - 在 Google Colab 中打开 csv 文件时出现 NaN
- javascript - 删除您没有引用的事件侦听器
- css - 在 Bootstrap 中将图像移动到卡片的右侧
- java - 为什么“fileInputStream.read()”的值被改变了?
- python - 使用 matplotlib 绘制字典列表
- r - Bookdown 未建立 - 替换长度为零
- java - 从 lambda 表达式 stream().filter() 返回字符串
- mysql - 为什么我不能在eclipse中连接到mysql数据库?
- shell - 詹金斯:字符串参数无法正常工作
- android - 以编程方式使用系统无法识别的 BTLE 设备