Java Spring引导生成器模式实体到dto

Java Spring引导生成器模式实体到dto,java,spring,spring-boot,design-patterns,builder-pattern,Java,Spring,Spring Boot,Design Patterns,Builder Pattern,我正在创建一个api,用于从另一个Web服务传输数据。我正在寻找一种将对象从webservice转换为DTO的好方法。从对象到DTO的转换有一些逻辑 我现在已经实现了这个(伪代码): 我有一个主构建器,它包含其他构建器可以使用的通用代码 @Component public abstract class RelationDtoBuilder <T extends RelationDtoBuilder <T>> { protected abstract T getThis()

我正在创建一个api,用于从另一个Web服务传输数据。我正在寻找一种将对象从webservice转换为DTO的好方法。从对象到DTO的转换有一些逻辑

我现在已经实现了这个(伪代码):

我有一个主构建器,它包含其他构建器可以使用的通用代码

@Component
public abstract class RelationDtoBuilder <T extends RelationDtoBuilder <T>> {
protected abstract T getThis();

@Autowired
private PhoneNumberDtoBuilder phoneNumberDtoBuilder ;

protected List<PhoneNumberDto> phoneNumbers= new ArrayList<>();

public T setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
    if (phoneNumbers!= null) {
        phoneNumbers.stream().forEach(phoneNumber -> {
            this.phoneNumbers.add(
                    phoneNumberDtoBuilder 
                            .setNumber(branch.getNumber())
                            .setType(branch.getType())
                            .build()
            );            });
    }
    return getThis();
}

}
@组件
公共抽象类RelationDtoBuilder{
保护抽象T getThis();
@自动连线
私人电话号码ToBuilder电话号码ToBuilder;
受保护的列表电话号码=新的ArrayList();
公共T设置电话号码(列出电话号码){
if(电话号码!=null){
phoneNumber.stream().forEach(phoneNumber->{
这个是.phoneNumbers.add(
电话号码ToBuilder
.setNumber(branch.getNumber())
.setType(branch.getType())
.build()
);            });
}
返回getThis();
}
}
PersonDto的子类生成器

@Component
public final class PersonDtoBuilder extends RelationDtoBuilder<PersonDtoBuilder> {

@Override
protected PersonDtoBuilder getThis() {
    return this;
}

public PersonDto build() {
    PersonDto personDto = new PersonDto();
    PersonDto.setPhoneNumbers(super.phoneNumbers);
    return PersonDto;
}

}
@组件
公共最终类PersonDtoBuilder扩展RelationDtoBuilder{
@凌驾
受保护人员创建程序获取此(){
归还这个;
}
公共建筑人员{
PersonDto PersonDto=新PersonDto();
PersonDto.setPhoneNumbers(super.phoneNumbers);
返回个人;
}
}
CompanyTo的子类生成器

@Component
public final class CompanyDtoBuilder extends RelationDtoBuilder<CompanyDtoBuilder > {

protected List<BranchDto> branches = new ArrayList<>();

@Override
protected CompanyDtoBuilder getThis() {
    return this;
}

public CompanyDtoBuilder setBranches(List<Branch> branches) {
    if (branches != null) {
        branches.stream().forEach(branch -> {
            this.branches.add(
                    branchDtoBuilder
                            .setName(branch.getName())
                            .setType(branch.getType())
                            .setPhoneNumbers(branch.getPhoneNumbers)
                            .build()
            );
        });          
    }
    return getThis();
}


public CompanyDtoBuilder build() {
    CompanyDto companyDto= new CompanyDto ();
    companyDto.setPhoneNumbers(super.phoneNumbers);
    companyDto.setBranches(this.branches);
    return CompanyDto;
}


}
@组件
公共最终类CompanyToBuilder扩展了RelationDtoBuilder{
受保护列表分支=新建ArrayList();
@凌驾
受保护的公司ToBuilder getThis(){
归还这个;
}
上市公司ToBuilder setBranches(列出分支机构){
if(分支!=null){
branchs.stream().forEach(分支->{
这个。分支。添加(
branchDtoBuilder
.setName(branch.getName())
.setType(branch.getType())
.setPhoneNumber(branch.getPhoneNumber)
.build()
);
});          
}
返回getThis();
}
上市公司ToBuilder build(){
CompanyDto CompanyDto=新CompanyDto();
companyDto.setPhoneNumbers(super.phoneNumbers);
公司地址:setBranches(本公司分公司);
返回公司;
}
}
BranchDtoBuilder

@Component
public final class BranchDtoBuilder extends RelationDtoBuilder<PersonDtoBuilder>{

@Autowired
private ValueConverterService valueConverterService;

private String name;
private String type;

@Override
protected BranchDtoBuilder getThis() {
    return this;
}

public BranchDtoBuilder setName(String name) {
    this.name= name;
    return this;
}

public BranchDtoBuilder setType(String type) {
    if (type != null) {
        this.type= valueConverterService.convertValue("branchType", type);
    }
    return this;
}

public BranchDtoBuilder build() {
    BranchDto branchDto = new branchDto();
    branchDto.setSoort(this.soort);
    branchDto.setWaarde(this.waarde);
    branchDto.setPhoneNumbers(this.datumIngang);
    return branchDto ;
}

}
@组件
公共最终类BranchToBuilder扩展了RelationDtoBuilder{
@自动连线
私人价值转换服务价值转换服务;
私有字符串名称;
私有字符串类型;
@凌驾
受保护的BranchDtoBuilder获取此(){
归还这个;
}
公共BranchToBuilder集合名(字符串名){
this.name=name;
归还这个;
}
公共BranchToBuilder集合类型(字符串类型){
if(type!=null){
this.type=valueConverterService.convertValue(“branchType”,type);
}
归还这个;
}
公共分支ToBuilder build(){
BranchDto BranchDto=新的BranchDto();
branchDto.setSoort(this.soort);
branchDto.setWaarde(this.waarde);
branchDto.setPhoneNumber(this.datumIngang);
返回branchDto;
}
}
问题是de BranchDtoBuilder使用的电话号码引用与CompanyToBuilder相同。如何在没有重复代码的情况下构建dto


其次,这是将实体映射到dto(逻辑作为数据库转换)的最佳方式吗(BranchDtoBuilder)?

这是将实体映射到dto(逻辑作为数据库转换)的最佳方式吗?
-IMO您不需要以这种方式使类型转换复杂化。此外,
IMO的最佳方法是使用mapstruct mapper接口等工具