MapStruct 记录到记录的映射不起作用

问题描述 投票:0回答:1

我尝试将 Java 记录从一个包转换为另一个包。

@Mapper
public interface KriteriumMapper {

    KriteriumMapper INSTANCE = Mappers.getMapper(KriteriumMapper.class);
    de.model.Kriterium fromPersistenceRecord(Kriterium k);
}
package de.persistence.model.nontransactional;

public record Kriterium(String name, String crkSpaltenname) {}

package de.model;

public record Kriterium(String name, String crkSpaltenname) {}

但是Mapstruct为新记录创建了一个带有空构造函数的映射器,这显然是不可能的:

@Override
public de.Kriterium fromPersistenceRecord(de.persistence.model.Kriterium k) {
    if ( k == null ) {
        return null;
    }
    
    de.model.Kriterium kriterium = new de.Kriterium();
    
    return kriterium;
}

Mapstruct 版本是

1.5.5.Final

如何处理Java记录到记录的映射?

我期待一个映射器实现使用 jave 记录的常规所有参数构造函数。

java mapstruct java-17 java-record
1个回答
1
投票

你混淆了包名称,我注意到你使用了超过 2 个

Kriterium
类:

  • de.persistence.model.nontransactional.Kriterium
  • de.persistence.model.Kriterium
  • de.Kriterium

您需要仔细检查是否在

KriteriumMapper
中使用了正确包中的类。

这是记录到记录映射的最小工作示例:

@Mapper
public interface KriteriumMapper {

    Kriterium2 fromPersistenceRecord(Kriterium k);
}

public record Kriterium(String name, String crkSpaltenname) {}

public record Kriterium2(String name, String crkSpaltenname) {}

这是编译后生成的

KriteriumMapperImpl
实现:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-10-02T18:18:30+0700",
    comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.1 (Oracle Corporation)"
)
public class KriteriumMapperImpl implementsKriteriumMapper {

    @Override
    public Kriterium2 fromPersistenceRecord(Kriterium k) {
        if ( k == null ) {
            return null;
        }

        String name = null;
        String crkSpaltenname = null;

        name = k.name();
        crkSpaltenname = k.crkSpaltenname();

        Kriterium2 kriterium2 = new Kriterium2( name, crkSpaltenname );

        return kriterium2;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.