2 回答
TA贡献1808条经验 获得超4个赞
您可以编写一个ResponseAdvice来根据身份验证级别装饰响应。
首先JsonIgnore在您不想显示的字段上,即使值为null.
@JsonIgnore
private String advancedField;
现在,设置ResponseAdvice.
@ControllerAdvice
public class MyResponseBodyAdvisor implements ResponseBodyAdvice<String> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return returnType.getDeclaringClass().equals(MyClass.class) && converterType.equals(MappingJackson2MessageConverter.class);
}
@Override
public String beforeBodyWrite(String body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});
String currentRole = SomeContext.getCurrentRole();
if(currentRole.equals(Roles.SomeRole)) {
map.put("advancedField", "advancedValue");
}
return mapper.writeValueAsString(map);
}
}
这就是你所要做的。使用这种方法的优点是,您可以通过这种方法绑定到Spring生态系统,并且可以使用它提供的所有好处,如果您需要依赖注入等等。此外,它比在Serializer. 如果您需要对您的用例提供更好的支持,您应该查看ResponseAdvice 。
TA贡献1789条经验 获得超8个赞
您需要实现一个自定义过滤器并将其添加到您的 ObjectMapper 实例中。假设您想要做更复杂的事情,而不仅仅是检查一个值是否为空,那么您可以创建一个自定义过滤器,该过滤器在您想要有条件地序列化的属性的注释中使用类似于表达式的东西。
我最近建立了类似的东西 - https://github.com/johnhunsley/conditional-jackson-property-filter
添加回答
举报