[英]Needed to filter null values from JSON response in spring boot project
[英]How to filter attributes from JSON response in spring?
我有一个如下所示的 controller,
@RequestMapping(value = "rest/v1/tester")
public class TestController {
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<SampleResults> search(@ModelAttribute("criteria")SampleCriteria criteria) throws Exception {
SampleResults sampleResults = sampleService.search(criteria);
return new ResponseEntity<>(sampleResults, OK);
}
}
我有另一个 controller 像这样,
@RequestMapping(value = "rest/v1/second")
public class SecondTestController {
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<SampleResults> search(@ModelAttribute("criteria")SampleCriteria criteria) throws Exception {
SampleResults sampleResults = secondsampleService.search(criteria);
return new ResponseEntity<>(sampleResults, OK);
}
}
我的结果结构如下:
public class SampleResults extends Results<SearchSummary, Sample> {
}
这从结果 class 延伸而来:
public class Results<SUMMARY,RESULTS> {
private SUMMARY summary;
private List<RESULTS> results;
/*Constructors, getters and setters*/
}
现在我要设置到结果字段中的 model 是,
@JsonDeserialize(as = SampleImpl.class)
public interface Sample {
Long getId();
void setId(Long id);
String getName();
void setName(String name);
int getAge();
void setAge(int age);
}
public class SampleImpl implements Sample {
private Long id;
private String name;
private int age;
/* Getters and Setters */
}
现在对于上面提到的 TestController,我想显示 json 响应中的所有字段,而在 SecondTestController 中,我想屏蔽(不显示)json 响应中的 age 属性。 我怎样才能在 spring 中实现这一目标。非常感谢任何帮助!
您是否考虑过@JsonView
?
Spring MVC支持它,它允许您根据序列化的上下文来过滤字段。
首先定义您的观点:
public class View {
interface SampleView { }
interface SampleViewWithAge extends SampleView { }
}
然后使用所需的视图注释字段:
public class SampleImpl implements Sample {
@JsonView(View.SampleView.class)
private Long id;
@JsonView(View.SampleView.class)
private String name;
@JsonView(View.SampleViewWithAge.class)
private int age;
// Getters and setters
}
最后,在序列化响应时注释您的处理程序以使用视图:
@JsonView(View.SampleView.class)
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<SampleResults> search() {
...
}
@JsonView(View.SampleViewWithAge.class)
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<SampleResults> searchWithAge() {
...
}
我认为最简单的方法是使用Jackson @JsonFilter
如果您希望它动态的话。
例如,这里可能是Spring Boot的一个例子:
您的文件:
@JsonFilter("myFilter")
class Document {
private field1;
private field2;
}
修改默认配置的HttpMessageConverter:
@Configuration
class WebMvcConfiguration extends WebMvcConfigurationSupport {
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for(HttpMessageConverter<?> converter: converters) {
if(converter instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper mapper = ((MappingJackson2HttpMessageConverter)converter).getObjectMapper();
mapper.setFilterProvider(new SimpleFilterProvider().addFilter("myFilter", SimpleBeanPropertyFilter.serializeAll()));
}
}
}
}
默认情况下,此筛选器将全部序列化。 此步骤是强制性的,如果不指定该步骤,则会出现一个异常,即将到来的时候他不知道myFilter
,此时您的控制器将尝试生成对象响应。
然后,在您的控制器中,这是您的常规端点,用于序列化所有字段(使用先前声明的过滤器):
@RequestMapping(value = "path/document", method = RequestMethod.GET)
public Document getDocumentWithAllFields() {
return new Document("val1","val2");
}
//result : {"field1":"val1","field2":"val2"}
现在,端点具有相同的对象,并且只序列化了一些字段:
@RequestMapping(value = "path/document", method = RequestMethod.GET)
public MappingJacksonValue getDocumentWithSomeFields(@RequestParam String[] fields) {
MappingJacksonValue wrapper = new MappingJacksonValue(new Document("val1","val2"));
FilterProvider filterProvider = new SimpleFilterProvider().addFilter("myFilter",
SimpleBeanPropertyFilter.filterOutAllExcept(fields));
wrapper.setFilters(filterProvider);
return wrapper;
}
//result : {"field1":"val1"} (with 'fields' being a coma separated list, containing here just "field1"
在模态类中使用必填字段覆盖toString方法,并将其显式转换为json,如下所示在第二个控制器方法中。
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
//get yourObject
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(yourObject);
公共类BeanFilterCustom {
public Object filterBean(Object object,String someBeanFilter) {
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("","");
FilterProvider filters = new SimpleFilterProvider()
.addFilter(someBeanFilter, filter);
MappingJacksonValue mapping = new MappingJacksonValue(object);
mapping.setFilters(filters);
return mapping.getValue();
}
}
您可以在不想包含在JSON中的字段上使用@JsonIgnore
。
public class SampleImpl implements Sample {
private Long id;
private String name;
@JsonIgnore
private int age;
/* Getters and Setters */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.