您可以使用@JsonView。这可能是最简单的解决方案,因为 @JsonView 可以与 JAX-RS 一起使用。
或者,它可以通过BeanPropertyFilter 来实现,类似于我不久前整理的another solution。
开始定义你的注解:
@Documented
@Retention(RUNTIME)
@Target({FIELD})
public @interface HiddenForRoles {
String[] value();
}
然后定义你的BeanPropertyFilter,它可以扩展SimpleBeanPropertyFilter:
public class HiddenForRolesPropertyFilter extends SimpleBeanPropertyFilter {
private String allowedRole;
public HiddenForRolesPropertyFilter(String allowedRole) {
this.allowedRole = allowedRole;
}
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen,
SerializerProvider provider,
PropertyWriter writer) throws Exception {
HiddenForRoles hiddenForRoles = writer.getAnnotation(HiddenForRoles.class);
if (hiddenForRoles != null) {
if (Arrays.asList(hiddenForRoles.value()).contains(allowedRole)) {
writer.serializeAsOmittedField(pojo, jgen, provider);
return;
}
}
// If no annotation is provided, the property will be serialized
writer.serializeAsField(pojo, jgen, provider);
}
}
根据您的需要将@HiddenForRoles 注释放在您的字段中,并确保使用@JsonFilter 注释该类:
@Data
@JsonFilter("hiddenForRolesPropertyFilter")
public class Foo {
private String bar;
@HiddenForRoles({"cat"})
private String biz;
}
最后,在ContextResolver 中为ObjectMapper 注册过滤器:
String currentUserRole = // Get role from the current user
FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("hiddenForRolesPropertyFilter",
new HiddenForRolesPropertyFilter(currentUserRole));
ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider);
如果你想让你的过滤器“全局”,即应用于所有bean,你可以创建一个混合类并用@JsonFilter注释它:
@JsonFilter("hiddenForRolesPropertyFilter")
public class HiddenForRolesPropertyFilterMixIn {
}
然后将mix-in类绑定到Object:
mapper.addMixIn(Object.class, HiddenForRolesPropertyFilterMixIn.class);