微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Mapstruct 中使用 Vavr 列表 - java:没有为返回类型 io.vavr.collection.List 注册实现类型

如何解决在 Mapstruct 中使用 Vavr 列表 - java:没有为返回类型 io.vavr.collection.List 注册实现类型

我正在尝试在具有 Vavr 列表的对象上使用 Mapstruct。

但我收到错误 CREATE or replace RULE transactions_insert_y2021s02 AS ON INSERT TO transactions DO INSTEAD INSERT INTO data.transactions_y2021s02 VALUES (NEW.*); 但在 java.util.List 上工作正常

几年前我看到另一个关于“Page”数据类型 Mapstruct return type 的问题,它有类似的错误,但我没有看到任何更新。

没有修复吗?在对象上调用 mapstruct 映射器时,我可以将 vavr 列表更改为 Java 列表,反之亦然,但是如果该对象具有具有 vavr 列表的子对象,那么我不确定可以做什么,因为在 mapstruct 映射器文件中我不能做任何东西。

我使用的是最新的 mapstruct 版本:

java: No implementation type is registered for return type io.vavr.collection.List

父对象:

      <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-mapstruct-binding</artifactId>
            <version>0.2.0</version>
        </dependency>

父内部对象:

import io.vavr.collection.List;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class ParentObject {
    private String parentField;

    private List<ParentInnerObject> parentInnerObjectList;

子对象:

@Data
@Builder
public class ParentInnerObject {
    private String parentInnerField;

ChildInnerObject:

import io.vavr.collection.List;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Childobject {
    private String childField;

    private List<ChildInnerObject> childInnerObjectList;

将父对象映射到子对象的示例映射器:

@Data
@Builder
public class ChildInnerObject {
    private String childInnerField;

测试类来测试映射器代码

@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.WARN)
public abstract class TestMapper {

    @Mapping(source = "parentField",target = "childField")
    @Mapping(source = "parentInnerObjectList",target = "childInnerObjectList")
    public abstract Childobject tochildobject(final ParentObject parentObject);

    public abstract List<ChildInnerObject> tochildobjects(
            final List<ParentInnerObject> parentInnerObjectList);

    @Mapping(source = "parentInnerField",target = "childInnerField")
    public abstract ChildInnerObject tochildInnerObject(final ParentInnerObject parentInnerObject);

编辑:- 暂时使用自定义映射器,直到 mapstruct 支持 vavr 列表

import io.vavr.collection.List;

@ExtendWith(MockitoExtension.class)
class TestMapperTest {
  //https://stackoverflow.com/questions/34067956/how-to-use-injectmocks-along-with-autowired-annotation-in-junit
  @Autowired
  @InjectMocks
  private TestMapperImpl testMapper;

  @Test
  @displayName("Check if the value is returned correctly")
  void testMapperCode(){
    ParentObject pa = ParentObject.builder()
            .parentField("parent field")
            .parentInnerObjectList(List.of(ParentInnerObject.builder()
                    .parentInnerField("parent inner field")
                    .build()))
            .build();
    /*ParentObject pa = ParentObject.builder()
            .parentField("parent field")
            .parentInnerObjectList(Collections.singletonList(ParentInnerObject.builder()
                    .parentInnerField("parent inner field")
                    .build()))
            .build();*/
    Childobject childobject = testMapper.tochildobject(pa);
    System.out.println(childobject);
  }

}

解决方法

Spring Data Page 数据类型与 Vavr List 不同。 Page 数据类型需要被视为 bean 而不是可迭代的,这将在即将发布的 1.5 版本中修复。

至于 Vavr List MapStruct 目前不支持使用它。您可以提出功能请求,以便我们讨论潜在的解决方案。

目前唯一的方法是为这些列表之间的映射编写自定义映射方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。