当前位置: 首页 > 知识库问答 >
问题:

具有mapStruct的内部不可变类

艾正浩
2023-03-14

我们在MapStruct中使用不可变项,在将实体转换为dto时遇到问题。

@Value.Immutable
public interface ProjectDto {
    String getId();
    String getName();
    //ProjectStatisticsDto getStatistics();
}

@Value.Immutable
public interface ProjectStatisticsDto {
    Long getCount();
}

@Immutable
public interface Project extends Serializable {
    @JsonProperty("_id")
    String getId();
    String getName();
    //ProjectStatistics getStatistics();
}

@Immutable
public interface ProjectStatistics extends Serializable {
    Long getCount();
}

mapper类

@Mapper
public interface ProjectMapper {
    ProjectMapper INSTANCE = Mappers.getMapper(ProjectMapper.class);
    ImmProjectDto toDto(ImmProject project); // This works only when the inner model of project statistics is commented.
    //ProjectDto toDto(Project project); THIS DOES NOT WORK (Error 1)
    // ImmProjectDto toDto(ImmProject project); After I uncomment the inner class of project statistics then even this does not work (Error 2)

在出现错误的情况下,问题是完全相同的

Error 1: No implementation was created for ProjectMapper due to having a problem in the erroneous element com.xyz.ProjectDto. 
Error 2: No implementation was created for ProjectMapper due to having a problem in the erroneous element com.xyz.ProjectStatisticsDto. 

我检查了mapstruct与不可变的测试,没有什么不同https://github.com/mapstruct/mapstruct/blob/master/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/Person.java.

我尝试删除序列化语句,但没有成功。我添加了一些冗长的声明

Note: MapStruct: Immutables found on classpath
Note: MapStruct: Using accessor naming strategy: org.mapstruct.ap.spi.ImmutablesAccessorNamingStrategy
Note: MapStruct: Using builder provider: org.mapstruct.ap.spi.ImmutablesBuilderProvider
Note: MapStruct: Using enum naming strategy: org.mapstruct.ap.spi.DefaultEnumMappingStrategy

这看起来绝对正确

共有1个答案

董哲
2023-03-14

看看问题“带mapStruct的内部不可变类”的标题,我猜您的不可变类位于另一个类中。

对于已经有PR的MapSTRt(参见mapstruct/mapstruct#2198)来说,这是一个已知的问题,它将在下一个非补丁版本中修复。

与此同时,您必须使您的不可变类成为顶级类。

 类似资料:
  • 我有一个显示为卡片的数据列表视图,我正在尝试一个纯粹的CSS解决方案,其中我只有内部边框线。 卡片每行最多显示两张,当有更多卡片时,卡片将换行到下一行。我们使用引导程序col-md-6来实现这一点。 下面是一个以卡片形式显示的三个数据项的示例,以及我试图通过内部网格线实现的目标。 笔记: 如果只有两项,则底线不应可见 我想我可以使用Lea Verou在这里提到的技术,但我一直没能让它发挥作用 无论

  • 问题内容: 在我们的hibernate项目中,使用java bean模式对实体进行编码。在我们的代码中,有很多地方有人忘记了设置变量的设置,但由于NOT NULL字段而导致异常。 是否有人在使用构建器来构建其实体或使其不可变? 我正在尝试找到一种不是Java bean模式样式的有效模式。 谢谢 问题答案: 如果使Bean不可变,则必须使用字段级访问,并且这附带了它自己的一系列问题,在此进行了详细讨

  • 我在使地图结构和不可变文件正常工作时遇到问题。 要测试的主类 我得到的错误是 我的如下 根据参考,这应该都是开箱即用的。我在这里错过了什么?

  • 问题内容: 我有一个简单的方法返回一个。 它还创建了一个本地。我想测试添加到本地的值。 这是一个例子 将新增至本地时,如何测试? 问题答案: 这不是那么容易。 您需要使用powermock之类的东西。 使用powermock可以在调用方法并进行播放之前创建一个场景,这意味着您可以告诉类构造函数预期被调用并返回a 而不是real 。 这将允许您在上断言。 这样的事情应该起作用: 因此,当您的方法创建

  • 对于将SFINAE与可变模板类一起使用,我似乎找不到一个好的解决方案。 假设我有一个不喜欢引用的可变参数模板对象: 以及一个类,可以方便地检查参数包是否包含引用: 我如何使用它来专门化NoRef的情况下,引用存在于arg包?

  • 问题内容: 假设我有一个任务要从java.util.concurrent.BlockingQueue中提取元素并进行处理。 如果可以动态更改频率,我该如何安排/重新安排任务? 想法是获取数据更新流并将其批量传播到GUI 用户应该能够更改更新频率 问题答案: 我认为您无法更改固定速率的延迟。我认为您需要使用schedule()执行一次操作,并在完成后再次计划(如果需要,可以更改超时)。