MyBatis resultMap 在 POJO 中带有一个 Builder

MyBatis resultMap with a Builder in the POJO

假设我有一个 java class 代表一个使用构建器模式的人:

package com.xyz.domain;

public class Person {

    private final int id;
    private final String firstName;
    private final String middleName;
    private final String lastName;
    private final String address;
    private final String country;

    private Person(PersonBuilder builder) {
        this.id = id;
        this.firstName = builder.firstName;
        this.middleName = builder.middleName;
        this.lastName = builder.lastName;
        this.address = builder.address;
        this.country = builder.country;
    }

    // getters go here

    public static class PersonBuilder {

        private int id;
        private final String firstName;
        private final String lastName;

        private String middleName;
        private String address;
        private String country;

        public PersonBuilder(int id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public PersonBuilder withMiddleName(String middleName) {
            this.middleName = middleName;
            return this;
        }

        public PersonBuilder withAddress(String address) {
            this.address = address;
            return this;
        }

        public PersonBuilder withCountry(String country) {
            this.country = country;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

我想在 mybatis resultMap 中使用它作为 type :

<resultMap id="Person" type="com.xyz.domain.Person">
    <id property="id" column="id" />
    <result property="firstName" column="first_name" />
    <result property="middleName" column="middle_name" />
    <result property="lastName" column="last_name" />
    <result property="address" column="address" />
    <result property="country" column="country" />
</resultMap>

然而,当我调用使用此结果映射的端点时,这会在我的 Spring 应用程序中产生 500 错误。我还尝试将 resultMap 中的 type 参数设置为 com.xyz.domain.Person.PersonBuilder,但也出现错误。有什么方法可以在不牺牲 Person class?

中的构建器模式的情况下完成这项工作

用@Alias("Person") 注解标记POJO。 还要确保在配置 myBatis 数据连接时包含包 com.xyz.domain 以扫描 POJO。

我可以通过像这样更新结果图来解决问题

<resultMap id="Person" type="com.xyz.domain.Person$PersonBuilder">
    <constructor>
        <idArg name="id" column="id" />
        <arg name="firstName" column="first_name" />
        <arg name="lastName" column="last_name" />
    </constructor>
    <result property="middleName" column="middle_name" />
    <result property="address" column="address" />
    <result property="country" column="country" />
</resultMap>

这将创建一个 PersonBuilder 对象列表,但很容易遍历该列表并在 java 中的每个列表项上调用 build() 方法:personBuilderList.stream().map(Person.PersonBuilder::build).collect(toList())