问题标签 [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 投票
2 回答
6272 浏览

mapstruct - 使用 Immutables 时关闭 MapStruct 中的“构建器”

如何在 MapStruct 中完全禁用“构建器”?我根本不想使用它们,因为它们给我带来了各种各样的问题。

我在 META-INF 下创建了服务文件(我更喜欢将其分配给映射 builder= 但我没有看到任何示例如何在代码中正确执行此操作)。

它仍在尝试使用我要映射到的“ModifiableXXX”实例的不可变“builder”实例实例。如果可以的话,我什至会采取一种方法将其强制为可修改类型。

在另一个映射中,使用更新 ModifiableXXX(使用 @AfterMapping 和 @MappingTarget)方法有效。

我的映射器现在看起来像这样:

0 投票
1 回答
1677 浏览

java - 这是在构建器对象中创建空集的最佳方法

一个类有一组定义为其实例变量的 String 对象。

步骤 1:我有一个为此类创建对象的方法,将一组空的 String 分配给实例变量,然后返回该对象。

接收它的方法将它传递给另一个方法,该方法将更多的 String 添加到该空集。

现在我应该如何在步骤 1 中创建空集?

一个。使用Collections.<String>emptyList()创建一个不可变的字符串集,当稍后在第二种方法中添加新字符串时,这不会出错。需要有关如何发生这种情况的基本原理的一些详细信息。

湾。new HashSet<>()这将创建一个可变映射。

哪种方法是正确的,为什么?有没有别的好办法?

0 投票
1 回答
130 浏览

java - 如何将不可变对象与公共构造函数一起使用但不序列化为元组样式?

我正在使用 Immutables,并且我将生成的类配置为通过构造函数进行实例化。

然而,现在实例被序列化为https://immutables.github.io/json.html#tuples-of-constructor-arguments中指定的元组

相反,我需要与使用 builder 而不是构造函数时相同的序列化

是否可以禁用序列化为元组?

0 投票
1 回答
2469 浏览

spring-boot - MapStruct 未检测到构建器中的设置器

我正在使用 spring 构建一个简单的 REST 服务。我将我的实体与 DTO 分开,并使用Immutables使 DTO 成为不可变的。我需要 DTO 和 DAO 之间的映射,所以我选择了MapStruct。Mapper 无法检测到我在 DAO 中定义的设置器。

该问题与此问题完全相同。这个问题没有公认的答案,我已经尝试了该问题中的所有建议,但它们不起作用。我不想尝试这个答案,因为我觉得它违背了我使用 Immutables 的目的。@marc-von-renteln 在这里的评论中很好地总结了这个原因

我尝试了@tobias-schulte 提供的答案。但这导致了一个不同的问题。在答案的 Mapper 类中,尝试从映射方法返回 Immutable*.Builder 会引发错误,指出找不到 Immutable 类型。

我已经详尽搜索了针对 MapStruct 和 Immutables 记录的问题,但我无法找到解决方案。不幸的是,很少有例子或人使用 MapStruct 和 Immutables 的组合。mapstruct -examples存储库也没有使用 Immutables 的示例。

我什至尝试为每个 DtTO 定义单独的 Mapper 接口(如 UserStatusMapper)。我只是让它变得更复杂,错误更多。

我创建了一个示例 spring 项目来演示该问题。 GitHub 回购链接。这个演示应用程序与我正在创建的 REST 服务几乎相同。所有数据库(spring-data-jpa,hibernate)的东西都被删除了,我正在使用模拟数据。如果您签出项目并运行演示应用程序,您可以进行两次 API 调用。

GetUser:请求: http://localhost:8080/user/api/v1/users/1 响应:

Createuser:问题在这里 http://localhost:8080/user/api/v1/users/create 示例输入:

回复:

以下是与问题相关的重要代码:

道: 1. UserDao

2. 用户状态道:

DTO 1. UserDto:

2. UserStatusDto:

MapStruct 用户映射器:

如果我查看 MapStruct for 生成的具体方法,userDtoToDao我可以清楚地看到设置器没有被识别。

0 投票
1 回答
1035 浏览

java - 选择性地@JsonIgnore Immutables 访问器方法,仅在使用 Jackson 进行序列化或反序列化期间

这绝对不是仅在序列化期间使用 @JsonIgnore 而不是反序列化的副本。问题是相同的,但在Immutables的上下文中。

当模型(DTO/DAO)被修饰为不可变时,我无法在序列化期间选择性地@JsonIgnore 属性之一。假设我们有一个 UserDto,它被定义为一个 Immutable,如下所示

我相信可以期望在序列化过程中我们希望忽略password服务响应中的 。

如果我们使用一个简单的类而不使用 Immutables,那么有很多方法可以实现这一点。例如 - 仅用 注释 getter @JsonIgnore。或者,如果可能,定义一个不同的访问器方法(没有 get 前缀的东西)并且只定义常规的 setter 方法......等等。

如果我在 Immutables 访问器方法上尝试相同的密码,如下所示:

然后,生成的 ImmutableUserDto 在 getter 和 setter 上添加 @JsonIgnore,如下所示。

序列化将按预期工作。该password属性将从 JSON 中排除。但是当我尝试反序列化时,出现以下错误:

这很明显,因为 Immutables 也将 setter 添加@JsonIgnore到了 setter 中。

文档没有太大帮助。在他们的注意事项部分中,它只提到了以下关于@JsonIgnore

如果使用@JsonIgnore,您应该明确地使属性成为非强制性的。在 Immutables 中,可以通过 @Nullable、Optional 或 @Value.Default 将属性声明为非强制性的,它们的效果都不同,我们不会自动派生任何东西。

在诸如. @Nullable_ Optional_@Value.Defaultpassword

我已经浏览了他们 GitHub 页面上的问题列表,并且有一个类似的问题,但用户要求稍微不同的用例,使用 @Nullable 可以解决在我的情况下不起作用的问题。

我也尝试在这里使用其中一个答案。仍然导致同样的错误。

看起来这不受 Immutables 库的支持。我自己创建了一个新问题。一旦我从用户那里得到一些关于 SOF 的反馈,我可能会创建一个sscce

0 投票
1 回答
841 浏览

java - 不能写字段名,需要一个值

当我们从 Jackson 版本 2.8.9 切换到 2.9.8 时,我们在以 CBOR 格式序列化数据时遇到了一些麻烦。事实证明,我们一直在使用的自定义 Jackson 模块在这个新版本中造成了麻烦。这些问题从版本 2.9.0 开始。

我创建了一个重现问题的存储库,发现当我禁用我们的自定义问题时,TemporalAmountModule问题就消失了。我自己没有写,TemporalAmountModule但看起来自定义序列化器和反序列化器是罪魁祸首。这些并没有引入任何复杂的代码,但我真的不明白为什么它们不再正常工作,因为我不熟悉序列化器和反序列化器。

我已经创建了一个存储库来重现我遇到的问题。当您禁用该模块时,您可以看到它工作正常。当您将 jackson 版本更改为 2.8.x(该范围内的最新版本是 2.8.11)时,您可以看到它也可以正常工作。

https://github.com/Archcry/reproduce-jackson-error

预期结果应该与 2.8.9 版(或 2.8.11 版)中的结果相同。Jackson 不应该破坏次要版本中的任何功能,但它可能会弃用某些方法(他们确实这样做了)。不推荐使用的方法不是导致问题的方法,因为我尝试更新它们但最终得到相同的结果。目前的实际结果是错误的说法Can not write a field name, expecting a value

0 投票
1 回答
1636 浏览

java - MongoDB 的不可变自动生成存储库抛出“找不到接口的编解码器”CodecConfigurationException

问题描述。

这是当前在immutables 站点中的示例的简化版本。

所以我有一个我想与 MongoDB 一起使用的项目。

为简单起见,我创建了一个 Junit 测试。就像例子一样。问题是这个 junit 测试,虽然它在immutables 站点的示例中出现,但会引发异常:

运行此测试将导致以下异常:

org.bson.codecs.configuration.CodecConfigurationException:找不到接口 spyros.stackoverflow.example.Item 的编解码器

下面提供了完整的堆栈跟踪。

我使用 gradle,build.gradle如下所示。

已查明原因

Immutables JSON 库需要能够找到自动生成GsonAdaptersItem.classimplements com.google.gson.TypeAdapterFactory. 事实上,对于每一个interfaceabstract class命名XXX的具有与“类项目”(如上提供)类似的注释的不可变对象将生成一个类似GsonAdapterXXXimplements com.google.gson.TypeAdapterFactory

为了能够自动找到这些类,RepositorySetup使用java.util.ServiceLoader自动定位它们。这是相关的代码部分:

引发异常的原因是由于某种原因这似乎不起作用,并引发了以下异常。

更新 进一步的研究表明该示例有效,但前提是已编译 jar。这是因为 Immutables 生成了以下文件,该文件实际上将用于查找所有必需的GsonAdapterXXX类。

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for interface spyros.stackoverflow.example.Item 这是源代码的永久链接。

解决 方法 直接的解决方法是专门GsonAdaptersItemGsonBuilder. 以下 Junit 测试有效。

此解决方法可用于手动创建通用 api,程序员需要提供GsonAdapterXXX. 例如,还可以创建ItemRepository itemRepository=reporitoryProvider.getRepositoryWithRegisteredGsonAdapter(new GsonAdaptersItem()); 更具体的提供者。XXXRepository

但是,以上所有内容都需要维护,更容易出错,并且无论如何都需要编写样板代码,这是使用 Immutables 的人希望避免的。

问题

我希望该示例应该像immutables 站点中所示那样工作。我最好的猜测是,由于我使用 gradle 而不是 maven,也许我需要更改一些设置或依赖项。问题是:需要进行哪些更改才能使简单的 ItemRepository 创建(如下所示)起作用?

是否可以使用 Immutables 而无需手动编写逐个类或逐个包注册编解码器的代码?我真的很感激解释为什么它一开始就不起作用。

0 投票
2 回答
341 浏览

java - 无法将 IntelliJ Idea 配置为使用 @Immutables 注释

我已经按照Immutables 教程IntelliJ Idea. 出于某种原因,IDE 仍将生成的注释类显示为错误,尽管maven编译正常进行。知道如何解决这个问题吗?

0 投票
0 回答
248 浏览

java - 强制不可变接口实现功能接口

我正在使用 Java 不可变库http://immutables.github.io/ 我有 3 个不可变类,所以基本上是 3 个带有一堆参数的类。对于这些类中的每一个,我们都有一个唯一的键。

所以,我决定定义一个这样的接口:

现在,我希望每个 Immutable 类都实现这个接口,这里是一个例子

这一切正常。我之所以能够做到这一点,是因为我知道我应该为 getKey 提供一个实现,否则在构建 Immutable java 对象时我会得到一个异常。

有没有办法强制用户在定义实现 DataKey 接口的不可变类时强制开发人员提供 getKey() 的实现?

目的; 我可以在这些不可变类上编写通用代码,并保证它们都有一个名为 getKey() 的方法

0 投票
1 回答
1882 浏览

java - Swagger requestbody 示例值为空

我们正在尝试设置 springfox:swagger-ui。但是,当使用 Value.Immutable 接口使用 post 方法创建 restcontroller 时,示例正在显示{},模型显示接口名称,但没有其他内容。

我注意到,当我使用 Immutable 类作为 requestbody 时,该示例显示了它的所有属性。我尝试在界面上添加子类型(@ApiModel(subTypes = ImmutableInputLead.class))和父配置(@ApiModel(parent = ImmutableInputLead.class)),并没有改变任何东西

这是我们的不可变接口:

我们的映射:

我们的对象映射器:

我们的招摇配置:

我希望 InputLead 类的变量会显示在示例中。

我究竟做错了什么?