我正在使用jHipster开发一个rest api webservice,我想像facebook graph api那样进行字段过滤(例如:http://myjhipster_web_service.com/api/user?fields=id,username) 问题是我不知道如何让杰克逊Json序列化做到这一点,所以我决定做一个ResponseBodyAdvice并自己序列化数据, 对于性能问题,我想禁用Jackson序列化,以便响应不会被序列化两次。 所以我的问题是如何在Jhipster中仅禁用jackson响应序列化?还有另一种解决方案吗?
答案 0 :(得分:0)
第一个想法
您可以将请求(所选字段)和结果(用户/ s)包装在REST控制器中,例如:在某个类GraphResponse
中。
如果REST控制器中的映射返回GraphResponse
,Jackson会尝试序列化该映射。
因此,您可以为该类添加自己的seriablizer:
public class GraphResponseSerializer extends JsonSerializer<GraphResponse> {
@Override
public void serialize(GraphResponse response, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
// use jsonGenerator to write the JSON-stuff
}
}
您可以通过JacksonConfiguration
或使用如下注释注册该序列化程序:
@JsonSerialize(using = GraphResponseSerializer.class)
public class GraphResponse {
// setter getter for "fields"
// setter getter for the actual response-object
}
第二个想法
您可以通过添加自己的BeanSerializerModifier
来修改bean /实体的序列化方式,这是(AFAIR)负责的。
第三个想法
您可以添加自己的HttpMessageConverter
,它将对象处理为http-output,将http-input处理为对象转换。由于杰克逊被执行,因为MappingJackson2HttpMessageConverter
会自动注册,您可以覆盖MappingJackson2HttpMessageConverter
并实现某些内容来转变序列化......
第四个想法
在某些项目中,我们使用了GraphQL(http://graphql.org/),您可以使用图形查询,这非常强大,并根据实体为您完成所有过滤等操作。 GraphQL还有一个spring-boot-starter,所以你可以很容易地将它添加到jhipster项目中