在 Mapstruct 中使用 Vavr 列表 - java: return 类型 io.vavr.collection.List 没有注册实现类型
Use Vavr list in Mapstruct - java: No implementation type is registered for return type io.vavr.collection.List
我正在尝试在具有 Vavr 列表的对象上使用 Mapstruct。
但我收到错误 java: No implementation type is registered for return type io.vavr.collection.List
但在 java.util.List
上工作正常
几年前我看到另一个关于“Page”数据类型的问题 Mapstruct return type,它有类似的错误,但我没有看到任何更新。
没有修复吗?在对象上调用 mapstruct 映射器时,我可以将 vavr 列表更改为 Java 列表,反之亦然,但是如果该对象具有具有 vavr 列表的子对象,那么我不确定可以做什么,因为在 mapstruct 映射器内部文件我什么也做不了。
我正在使用最新的 mapstruct 版本:
<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;
ParentInnerObject:
@Data
@Builder
public class ParentInnerObject {
private String parentInnerField;
子对象:
import io.vavr.collection.List;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class ChildObject {
private String childField;
private List<ChildInnerObject> childInnerObjectList;
ChildInnerObject:
@Data
@Builder
public class ChildInnerObject {
private String childInnerField;
将 ParentObject 映射到 ChildObject 的示例映射器:
@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);
测试class测试映射器代码:
import io.vavr.collection.List;
@ExtendWith(MockitoExtension.class)
class TestMapperTest {
//
@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);
}
}
编辑:-
现在使用自定义映射器,直到 mapstruct
支持 vavr 列表
import io.vavr.collection.Iterator;
import io.vavr.collection.List;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN)
public abstract class TestMapper {
@Mapping(source = "parentField", target = "childField")
//@Mapping(source = "parentInnerObjectList", target = "childInnerObjectList") //This does not work as Mapstruct does not support Vavr list yet
@Mapping(target = "childInnerObjectList", expression = "java(vavrListSetter(parentObject.parentInnerObjectList))") //custom mapper
public abstract ChildObject toChildObject(final ParentObject parentObject);
@Mapping(source = "parentInnerField", target = "childInnerField")
public abstract ChildInnerObject toChildInnerObject(final ParentInnerObject parentInnerObject);
public List<ChildInnerObject> vavrListSetter(final List<ParentInnerObject> parentInnerObjectList) {
if (parentInnerObjectList == null) {
return null;
}
return Iterator.ofAll(parentInnerObjectList)
.map(this::toChildInnerObject)
.collect(List.collector());
}
Spring 数据页数据类型与 Vavr 列表不同。 Page 数据类型需要被视为 bean 而不是可迭代对象,这将在即将发布的 1.5 版本中得到修复。
至于 Vavr List MapStruct 现在不支持使用它。您可以提出功能请求,以便我们讨论可能的解决方案。
目前唯一的方法是为这些列表之间的映射编写自定义映射方法。
我正在尝试在具有 Vavr 列表的对象上使用 Mapstruct。
但我收到错误 java: No implementation type is registered for return type io.vavr.collection.List
但在 java.util.List
几年前我看到另一个关于“Page”数据类型的问题 Mapstruct return type,它有类似的错误,但我没有看到任何更新。
没有修复吗?在对象上调用 mapstruct 映射器时,我可以将 vavr 列表更改为 Java 列表,反之亦然,但是如果该对象具有具有 vavr 列表的子对象,那么我不确定可以做什么,因为在 mapstruct 映射器内部文件我什么也做不了。
我正在使用最新的 mapstruct 版本:
<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;
ParentInnerObject:
@Data
@Builder
public class ParentInnerObject {
private String parentInnerField;
子对象:
import io.vavr.collection.List;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class ChildObject {
private String childField;
private List<ChildInnerObject> childInnerObjectList;
ChildInnerObject:
@Data
@Builder
public class ChildInnerObject {
private String childInnerField;
将 ParentObject 映射到 ChildObject 的示例映射器:
@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);
测试class测试映射器代码:
import io.vavr.collection.List;
@ExtendWith(MockitoExtension.class)
class TestMapperTest {
//
@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);
}
}
编辑:- 现在使用自定义映射器,直到 mapstruct
支持 vavr 列表import io.vavr.collection.Iterator;
import io.vavr.collection.List;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN)
public abstract class TestMapper {
@Mapping(source = "parentField", target = "childField")
//@Mapping(source = "parentInnerObjectList", target = "childInnerObjectList") //This does not work as Mapstruct does not support Vavr list yet
@Mapping(target = "childInnerObjectList", expression = "java(vavrListSetter(parentObject.parentInnerObjectList))") //custom mapper
public abstract ChildObject toChildObject(final ParentObject parentObject);
@Mapping(source = "parentInnerField", target = "childInnerField")
public abstract ChildInnerObject toChildInnerObject(final ParentInnerObject parentInnerObject);
public List<ChildInnerObject> vavrListSetter(final List<ParentInnerObject> parentInnerObjectList) {
if (parentInnerObjectList == null) {
return null;
}
return Iterator.ofAll(parentInnerObjectList)
.map(this::toChildInnerObject)
.collect(List.collector());
}
Spring 数据页数据类型与 Vavr 列表不同。 Page 数据类型需要被视为 bean 而不是可迭代对象,这将在即将发布的 1.5 版本中得到修复。
至于 Vavr List MapStruct 现在不支持使用它。您可以提出功能请求,以便我们讨论可能的解决方案。
目前唯一的方法是为这些列表之间的映射编写自定义映射方法。