繁体   English   中英

MyBatis resultMap与POJO中的构建器

[英]MyBatis resultMap with a Builder in the POJO

假设我有一个Java类,代表使用构建器模式的Person:

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 resultMaptype ,如下所示:

<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错误。 我也尝试过将resultMaptype参数设置为com.xyz.domain.Person.PersonBuilder并得到一个错误。 有什么办法可以在不牺牲Person类中的构建器模式的情况下进行此工作?

用@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())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM