您可能正在寻找的是一个Module。文档说模块是
可以使用ObjectMappers注册的扩展的简单接口,为默认功能提供一组明确定义的扩展。
以下是您如何使用它们来完成您想要的示例的示例。请注意,还有其他方法可以实现这一点;这只是其中之一。
一个简单的 DTO,可用于指定要过滤的属性:
public class PropertyFilter {
public Class<?> classToFilter;
public Set<String> propertiesToIgnore = Collections.emptySet();
public PropertyFilter(Class<?> classToFilter, Set<String> propertiesToIgnore) {
this.classToFilter = classToFilter;
this.propertiesToIgnore = propertiesToIgnore;
}
}
一个自定义模块,它根据attribute
您存储在当前request
.
public class MyModule extends Module {
@Override
public String getModuleName() {
return "Test Module";
}
@Override
public void setupModule(SetupContext context) {
context.addBeanSerializerModifier(new MySerializerModifier());
}
@Override
public Version version() {
// Modify if you need to.
return Version.unknownVersion();
}
public static class MySerializerModifier extends BeanSerializerModifier {
public BeanSerializerBuilder updateBuilder(SerializationConfig config,
BeanDescription beanDesc,
BeanSerializerBuilder builder) {
List<PropertyFilter> filters = (List<PropertyFilter>) RequestContextHolder.getRequestAttributes().getAttribute("filters", RequestAttributes.SCOPE_REQUEST);
PropertyFilter filter = getPropertyFilterForClass(filters, beanDesc.getBeanClass());
if(filter == null) {
return builder;
}
List<BeanPropertyWriter> propsToWrite = new ArrayList<BeanPropertyWriter>();
for(BeanPropertyWriter writer : builder.getProperties()) {
if(!filter.propertiesToIgnore.contains(writer.getName())) {
propsToWrite.add(writer);
}
}
builder.setProperties(propsToWrite);
return builder;
}
private PropertyFilter getPropertyFilterForClass(List<PropertyFilter> filters, Class<?> classToCheck) {
for(PropertyFilter f : filters) {
if(f.classToFilter.equals(classToCheck)) {
return f;
}
}
return null;
}
}
}
注意:BeanSerializerModifierchangeProperties
类中有一个方法更适合更改属性列表(根据文档)。因此,您可以通过适当的更改移动在to方法中编写的代码。updateBuilder
changeProperties
现在,您需要module
使用您的ObjectMapper注册此自定义。您可以从应用程序上下文中获取 Jackson HTTP 消息转换器,并获取其对象映射器。我假设您已经知道如何做到这一点,因为您也一直在处理延迟初始化问题。
// Figure out a way to get the ObjectMapper.
MappingJackson2HttpMessageConverter converter = ... // get the jackson-mapper;
converter.getObjectMapper().registerModule(new MyModule())
你完成了。当您想为特定类型的对象自定义序列化时,请为此创建一个PropertyFilter
,将其放入 aList
并使其作为当前请求中的属性可用。这只是一个简单的例子。您可能需要对其进行一些调整以满足您的需求。
在您的问题中,您似乎正在寻找一种方法来指定序列化对象本身的过滤属性。在我看来,应该避免这种情况,因为要过滤掉的属性列表不属于您的实体。但是,如果您确实想这样做,请创建一个interface
提供setters
和getters
的属性列表。假设接口的名称是CustomSerialized
Then,您可以修改MyModule
类以查找该CustomSerialized
接口的实例并相应地过滤掉属性。
注意:您可能需要根据您使用的库的版本来调整/调整一些东西。