Java 有条件地序列化集合字段最佳做法?
我已经有了一个解决问题的方法,我会在后面描述它,但我不喜欢它,这就是我为什么要问的原因 我正在使用泽西岛和杰克逊岛的最新图书馆。我有一个实体的rest服务,到目前为止,我有两个get方法:getById和getList,它们都使用jackson返回json。实体使用一对一关系来指代自身,因此它是一组实体。对于getList,我不希望该字段被序列化,对于getById,我希望它被序列化,但以我自己的方式 我的解决办法是: 对于getList,我使用字段上的视图 在实体bean中,我使用JsonView类FirstLevelOfCollection:Java 有条件地序列化集合字段最佳做法?,java,json,jersey,jackson,Java,Json,Jersey,Jackson,我已经有了一个解决问题的方法,我会在后面描述它,但我不喜欢它,这就是我为什么要问的原因 我正在使用泽西岛和杰克逊岛的最新图书馆。我有一个实体的rest服务,到目前为止,我有两个get方法:getById和getList,它们都使用jackson返回json。实体使用一对一关系来指代自身,因此它是一组实体。对于getList,我不希望该字段被序列化,对于getById,我希望它被序列化,但以我自己的方式 我的解决办法是: 对于getList,我使用字段上的视图 在实体bean中,我使用JsonVi
@JsonView(JacksonViews.FirstLevelOfCollection.class)
在rest服务getList方法中,我使用对象作为视图过滤器,因此不带@JsonView的所有字段都将包括在内:
ObjectMapper mapper = new ObjectMapper();
resultString = mapper.writerWithView(Object.class).writeValueAsString(resultObject);
对于getById,我使用自定义序列化
ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null, null, null));
testModule.addSerializer(Set.class, new EndEventCodesSerializer(Set.class));
mapper.registerModule(testModule);
resultString = mapper.writeValueAsString(resultObject);
我不能使用@JsonIgnore代替视图,因为这样自定义序列化也不会看到它。它可以工作,但它看起来很奇怪和丑陋,尤其是像这样排除字段,我也想实现这一点,但我不知道如何在默认情况下为所有未来的请求使用排除(getList行为)。我能有更好的解决办法吗?我接受了亚当·金特的建议。
我将@JsonIgnore放在所有引用字段上,实现了几个DTO,它们只是我实体类的包装器,我用这些DTO在rest服务中响应。考虑只使用一个传输对象。试图在看似枯燥的情况下将DB jpa实体插入JSON,最终会导致大量工作、混乱和潜在的安全问题。@Adam Gent您的意思是将JsonIgnore放在实体bean中的集合字段(对于getList rest方法)上,并为该集合字段(对于getById rest方法)编写一个带有getter的实体包装器?