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

将iterable映射到non iterable直接映射到DTO

仲孙诚
2023-03-14

我已经用MapStruct 1.1工作了几天,但还没有达到我所需要的。

我想做的是:我想将JPA实体映射到DTO,以便在Primefaces项目中实现更好的属性视图绑定。

所以我有我的实体如下:

病人JAVA

public class PatientEntity implements Serializable {

    @Id
    private long patid;

    // ...
    // countless properties here
    // ...

    private List<PersonEntity> persons;    // contains a history of persons

    // getters and setters
}

人JAVA

public class PersonEntity implements Serializable {

    @Id
    private long personid; // some id

    private String name;

    // other properties + getters/setters
}

我想把这些实体画成这样:

耐心等待。JAVA

public class PatientDto {
    private long patientNumber;

    private Date birthday;

    private PersonDto latestPersonInfo;

    // some other properties + getters/setters
}

潘松多。JAVA

public class PersonDto {

    private String name;

    private String surname;

    // some other properties + getters/setters
}

我编写了Mapper类和一个实用程序,就像GitHub上的官方示例中描述的那样(https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-nested-bean-mappings

我的Mapper和UTIL如下所示:

最晚的人。JAVA

@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface LatestPerson {

}

个人。JAVA

// Returns the one person object i need for the further properties
// returns the latest person object
public class PersonUtil {

    @LatestPerson
    public PersonEntity latest(List<PersonEntity> persons) {

        if (persons != null && !persons.isEmpty()) {
            for (PersonEntity person : persons) {
                if (person.getPbisdatum() == null) {
                    return person;
                }
            }
        }

        return null;
    }
}

PatientMapper。JAVA

@Mapper(uses = PersonUtil.class)
public interface PatientMapper {

    PatientMapper INSTANCE = Mappers.getMapper(PatientMapper.class);

    @Mappings({
        @Mapping(source = "patnr", target = "patientNumber"),
        // other mappings
        @Mapping(source = "persons", target = "latestPersonInfo", qualifiedBy = LatestPerson.class)
    })
    PatientDto fromPatientEntity(PatientEntity patient);

}

人物apper.java

public interface PersonMapper {

    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mappings({
        @Mapping(source = "panrede", target = "salutation"),
        @Mapping(source = "ptitel", target = "title"),
        @Mapping(source = "pvorname", target = "name"),
        // other mappings
    })
    PersonDto fromPersonEntity(PersonEntity person);

    @InheritInverseConfiguration
    PersonEntity toPersonEntity(PersonDto personDto);

}

所以,我认为嵌套属性会自动转换,但看起来它们不会在这种情况下,我还会得到一个编译器错误,告诉我需要一个转换的映射方法:Perdto map(List

如果有人有想法,请告诉我或提供一些建议来实施一个好的解决方案。

注意:只有当我将PersonUtil更改为返回PersonDto并使用我显式编写的映射器时,应用程序才会编译,但随后会抛出NullPointerException,因为我的PersonMapper无法实例化。


共有2个答案

龙玄天
2023-03-14

另一种方法是,不需要创建限定符和Utils类。

在PatientMapper。JAVA

你可以直接用,

@Mappings({
    @Mapping(source = "patnr", target = "patientNumber"),
    @Mapping(target = "latestPersonInfo", expression = "java(PersonMapper.INSTANCE.fromPersonEntity(patient.getPersons().get(0)))")
    })
PatientDto fromPatientEntity(PatientEntity patient);
轩辕奕
2023-03-14

我找到了我的解决方案,只是没有发现我忘记用@Mapper注释注释我的PersonMapper

然而,如果有人曾经遇到过同样的问题,或者确实需要同样的功能,那么这种方法就会奏效。

更正的PersonMapper类:

人物apper.java

@Mapper    // <- I oversaw to add this
public interface PersonMapper {

  PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mappings({
        @Mapping(source = "panrede", target = "salutation"),
        @Mapping(source = "ptitel", target = "title"),
        @Mapping(source = "pvorname", target = "name"),
        // other mappings
    })
    PersonDto fromPersonEntity(PersonEntity person);

    @InheritInverseConfiguration
    PersonEntity toPersonEntity(PersonDto personDto);

}
 类似资料:
  • 在我的服务中,我试图将实体映射到,但是由于方法返回(),我不能像通常用于那样进行如下转换。它为方法抛出“不能在'iterable'中解析方法'stream'”错误。 那么,如何将这个实体映射到?

  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,

  • 问题内容: 我正在尝试将HTML映射到结构完整的JSON中。那里有没有这样做的库,还是我需要编写自己的库?我想如果没有html2json库,我可以以xml2json库作为开始。毕竟,html只是xml的一种变体,对吗? 更新: 好的,我应该举一个例子。我想做的是以下内容。解析html字符串: 变成这样的json对象: 注意 :如果您没有注意到标签,我正在寻找Javascript解决方案 问题答案:

  • 我正在构建一个REST API, 和ActiveBid类 和我的泽西请求映射器,它具有获取数据的逻辑 有人能帮我吗?我不知道和卡桑德拉共事会这么难。

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 字符串statusCode 在映射中,我有: statusCode列:“STATUS_CD”,类型:“NVARCHAR” beanCreationException:创建名为“Transaction ManagerPostProcessor”的bean时出错: bean初始化失败;嵌套异常是 org.springframework.beans.factory.beanCreationExcepti