Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有条件地序列化集合字段最佳做法?_Java_Json_Jersey_Jackson - Fatal编程技术网

Java 有条件地序列化集合字段最佳做法?

Java 有条件地序列化集合字段最佳做法?,java,json,jersey,jackson,Java,Json,Jersey,Jackson,我已经有了一个解决问题的方法,我会在后面描述它,但我不喜欢它,这就是我为什么要问的原因 我正在使用泽西岛和杰克逊岛的最新图书馆。我有一个实体的rest服务,到目前为止,我有两个get方法:getById和getList,它们都使用jackson返回json。实体使用一对一关系来指代自身,因此它是一组实体。对于getList,我不希望该字段被序列化,对于getById,我希望它被序列化,但以我自己的方式 我的解决办法是: 对于getList,我使用字段上的视图 在实体bean中,我使用JsonVi

我已经有了一个解决问题的方法,我会在后面描述它,但我不喜欢它,这就是我为什么要问的原因

我正在使用泽西岛和杰克逊岛的最新图书馆。我有一个实体的rest服务,到目前为止,我有两个get方法:getById和getList,它们都使用jackson返回json。实体使用一对一关系来指代自身,因此它是一组实体。对于getList,我不希望该字段被序列化,对于getById,我希望它被序列化,但以我自己的方式

我的解决办法是:

对于getList,我使用字段上的视图 在实体bean中,我使用JsonView类FirstLevelOfCollection:

@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的实体包装器?