问题标签 [immutables-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
151 浏览

java - 如何将不可变库与接口一起使用

我想让不可变对象成为我的 DTO 对象。为此,我想使用http://immutables.github.io/

我有下一个遗留层次结构:

为了保持向后兼容性,我想实现一个新的接口和实现,如下所示:

这应该生成 ImmutableInterface3 类,以便能够获得构建器并能够构建类实现。

问题是我不能使用下一条语句:

这个解决方案有什么问题吗?

0 投票
1 回答
871 浏览

java - 如何将 Jackson PropertyNamingStrategy 与 Immutables 库一起使用

我正在使用https://immutables.github.io/库和杰克逊。我希望我的课程是杰克逊可序列化的。我想使用自定义PropertyNamingStrategy(配置为com.fasterxml.jackson.databind.ObjectMapper使用 mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

不幸的是,Immutables 库将@JsonProperty("propertyName")生成代码的每个字段都放在了其中。这会覆盖在映射器级别(或在类级别,使用@com.fasterxml.jackson.databind.annotation.JsonNaming注释)定义的 PropertyNamingStrategy。

是否可以让 Immutables 库停止为每个字段放置属性名称(使用org.immutables.value.Value.Style或类似方式)?

我提供了解决方法,将@JsonProperty(没有价值)放在每个属性上,但我对此并不满意。

0 投票
1 回答
1142 浏览

java - 如何使不可变库跳过序列化可选字段

我正在使用 Immutables 库(https://immutables.github.io)。我需要我的类序列化为 JSON(我使用 Jackson)。我想跳过输出 JSON 中的可选字段。在 Immutables 之前,我@JsonInclude(JsonInclude.Include.NON_EMPTY)在课堂上提供。

看来,Immutables 不尊重该注释。如果我用它注释每个可选字段,@JsonInclude(JsonInclude.Include.NON_EMPTY)它就可以正常工作。

是否可以使用类级别(不是字段级别)注释指示不可变对象跳过序列化空选项?我看到org.immutables.value.Value.Style#additionalJsonAnnotations了,但没有使用它自定义传递的注释。

我的类路径中有 jackson-datatype-jdk8,我com.fasterxml.jackson.databind.ObjectMapper

mapper.registerModule(new Jdk8Module().configureAbsentsAsNulls(true));

0 投票
1 回答
365 浏览

java - Java Immutables 库:检查所有选项是否为空?

我想确定一个不可变Optional的所有成员是否都是空的。有没有办法自动执行此操作而无需手动检查所有已知的 Optionals?

我担心即使确实为每个可选成员写了一张支票,也会有人稍后出现并添加一个可选字段而不更新该方法。

0 投票
1 回答
341 浏览

java - 将元素添加到 Java 不可变队列

我希望有人可以帮助我解决我的小问题。我按照我的接口不可变队列以这种方式定义了我的 EmptyQueue 和我的 NotEmptyQueue。主要问题是应该向 myQueue 添加元素的方法 enQueue 不起作用。请帮助我:

界面:

空队列:

NotEmptyQueue:

0 投票
1 回答
555 浏览

java - 如何建议让 Immutables 用这种类型构建这个对象

我怎样才能让 Immutables 生成具有这种类型的类

注意:空集是从某个外部数据源传入的真实集的占位符,我还没有开始填充它,但我会在某个时候填充它,排序是对 Spring Security 中的重新实现,您应该假定排序需要应用于将传递给 Immutables 构建器的任何集合。

0 投票
1 回答
299 浏览

java - java org.immutables 库:地图中的所有重复插入

我正在使用java 不可变库

ImmutableFoo.builder().putBar(1, "asdf").putBar(1, "ghjk").build()导致重复键错误。有没有办法避免这种情况?

  • 如果我遇到具有不同值的同一个键,我想用新值覆盖旧值。
  • 如果我遇到具有相同值的相同键,我想忽略它。
0 投票
1 回答
837 浏览

java - 运行测试时如何防止 IntelliJ 删除从生成的源编译的类?

IntelliJ (v2016.3) 中 JUnit 测试的默认配置是Build在启动前运行。通常,这是一件好事,因为它确保在运行测试之前已经应用了所有更改。但是,它似乎正在删除生成代码的编译类。正如您所料,这意味着测试失败,因为生成的类的测试无法再找到他们试图测试的类!

如何在运行测试时保持 IntelliJ 的默认“启动前构建”行为,而不会让我编译生成的类被吹走?

现在了解一些细节。

我使用的是Immutables库(不是 Lombok),所以它是使用“普通”Java Annotations 机制生成的代码。IntelliJ 很高兴地接受更改并通过注释生成 Java 代码。它还将在更新生成的 Java 文件发生更改时对其进行编译。因此,一般的“自动构建”行为似乎正在起作用。对我来说,这似乎表明我正确设置了注释处理器。

但是,当我手动运行“构建模块”或在测试之前运行“构建”时,生成的 Java 文件的类文件将被删除。生成的 Java 文件不会以任何方式更改,但它们编译成的类文件会被删除。对我来说,这意味着 Build 有一些东西没有关注 Generated Source 依赖项。

我注意到的一件事是,如果我将生成源的目录标记为 Generated Source Root,则不会发生这种“删除生成的源文件的类文件”行为。这样做的缺点是 IntelliJ 不再识别生成的类,并在使用它们的代码中将它们标记为未知。

我如何配置 IntelliJ:

  • Preferences -> Annotation Processors正在使用Module content root, Obtain processors from project classpath, 并指定了生产和测试源目录字段(并且似乎在生成源文件时尊重那些)
  • Preferences -> Compiler不使用和正在使用_Clear output directory on rebuildBuild project automatically
  • File -> Other Settings -> Annotation Processors具有与上述两点相同的配置
  • 正在生成源的目录被标记为 Generated Source 目录

我一直在为此苦苦挣扎太久,尝试了我能想到的一切以及任何人甚至暗示的一切,但无济于事。任何有关如何使这项工作的帮助(“从测试配置中删除构建选项”除外)都将非常有帮助并深表感谢。

0 投票
3 回答
383 浏览

java - Immutable 中的可变项

当我们使用不可变对象库创建不可变类时,我们如何处理可变成员(例如juDate)?

注意:这与java Date 类无关,与不可变对象java 库完全相关,后者将生成一些代码!

例子:

有没有办法覆盖getter,以便它返回一个副本?

0 投票
1 回答
1102 浏览

java - 杰克逊子类序列化

我正在使用我不拥有且无法修改的 java API。该 API 定义了一个类Aggregation,该类是Immutables具有 Jackson 序列化和反序列化的 (immutables.github.io) 抽象类。

班级看起来像

我想向 Aggregation 添加一个字段,该字段应在序列化时提取,但仍可以将其实例传递给接受的方法Aggregation

我想做类似的事情:

这可能吗?