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())
假设我有一个 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())