From c7350da73a0ac965306d6e92f4095f20723d0ec8 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Sun, 24 Aug 2025 18:16:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=A0=E5=85=A5MapStruct=E7=9A=84?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 25 +++++++++ .../controller/SimpleControllerSupport.java | 4 ++ .../service/SimpleServiceSupport.java | 3 ++ .../service/template/TestApplication.java | 3 ++ .../controller/CompanyController.java | 29 ++++------ .../controller/EmployeeController.java | 43 ++++++--------- .../template/controller/ReportController.java | 54 ++++++++++--------- 7 files changed, 91 insertions(+), 70 deletions(-) diff --git a/pom.xml b/pom.xml index db8760e..915c948 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,8 @@ 3.4.3 2024.0.1 7.0 + 1.6.3 + 1.5.0 @@ -39,6 +41,13 @@ ${querydsl.version} + + org.mapstruct + mapstruct + ${mapstruct.version} + compile + + org.projectlombok lombok @@ -49,6 +58,12 @@ h2 test + + io.github.linpeilie + mapstruct-plus-spring-boot-starter + ${mapstruct-plus.version} + test + @@ -113,6 +128,16 @@ jakarta.persistence-api 3.2.0 + + io.github.linpeilie + mapstruct-plus-processor + ${mapstruct-plus.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + -Aquerydsl.entityAccessors=true diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java b/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java index acd41a8..2c39c16 100644 --- a/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java +++ b/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java @@ -222,4 +222,8 @@ public abstract class SimpleControllerSupport 实体到详情项的转换函数 */ protected abstract Function detailItemMapper(); + + public interface Mapper { + T map(S source) throws Exception; + } } \ No newline at end of file diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java b/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java index fef5ec1..fd01959 100644 --- a/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java +++ b/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; import lombok.extern.slf4j.Slf4j; +import org.mapstruct.Named; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; @@ -532,6 +533,7 @@ public abstract class SimpleServiceSupport implemen * @param id 实体ID * @return ENTITY 返回实体详情,不存在时返回null */ + @Named("detail") @Override public ENTITY detail(Long id) { return detailOptional(id).orElse(null); @@ -547,6 +549,7 @@ public abstract class SimpleServiceSupport implemen * @return ENTITY 返回实体详情 * @throws IdNotFoundException 当实体不存在时抛出 */ + @Named("detailOrThrow") @Override public ENTITY detailOrThrow(Long id) { return detailOptional(id).orElseThrow(() -> new IdNotFoundException(id)); diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java index f34132b..5eb3325 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java @@ -4,6 +4,7 @@ import com.blinkfox.fenix.EnableFenix; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.lanyuanxiaoyao.service.template.entity.Company; import com.lanyuanxiaoyao.service.template.entity.Company_; import com.lanyuanxiaoyao.service.template.entity.Employee; import com.lanyuanxiaoyao.service.template.entity.Employee_; @@ -11,6 +12,7 @@ import com.lanyuanxiaoyao.service.template.entity.QEmployee; import com.lanyuanxiaoyao.service.template.entity.Report; import com.lanyuanxiaoyao.service.template.entity.Report_; import com.lanyuanxiaoyao.service.template.repository.EmployeeRepository; +import io.github.linpeilie.annotations.ComponentModelConfig; import jakarta.annotation.Resource; import java.util.List; import org.slf4j.Logger; @@ -33,6 +35,7 @@ import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableFenix @EnableJpaAuditing +@ComponentModelConfig public class TestApplication { private static final Logger log = LoggerFactory.getLogger(TestApplication.class); private static final String BASE_URL = "http://localhost:2490"; diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java b/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java index 0f2ac73..6c89d8c 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java @@ -2,6 +2,8 @@ package com.lanyuanxiaoyao.service.template.controller; import com.lanyuanxiaoyao.service.template.entity.Company; import com.lanyuanxiaoyao.service.template.service.CompanyService; +import io.github.linpeilie.Converter; +import io.github.linpeilie.annotations.AutoMapper; import java.time.LocalDateTime; import java.util.function.Function; import lombok.AllArgsConstructor; @@ -15,39 +17,25 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("company") public class CompanyController extends SimpleControllerSupport { + private static final Converter converter = new Converter(); + public CompanyController(CompanyService service) { super(service); } @Override protected Function saveItemMapper() { - return item -> { - var company = new Company(); - company.setId(item.getId()); - company.setName(item.getName()); - company.setMembers(item.getMembers()); - return company; - }; + return item -> converter.convert(item, Company.class); } @Override protected Function listItemMapper() { - return company -> new ListItem( - company.getId(), - company.getName(), - company.getMembers() - ); + return company -> converter.convert(company, ListItem.class); } @Override protected Function detailItemMapper() { - return company -> new DetailItem( - company.getId(), - company.getName(), - company.getMembers(), - company.getCreatedTime(), - company.getModifiedTime() - ); + return company -> converter.convert(company, DetailItem.class); } @Setter @@ -55,6 +43,7 @@ public class CompanyController extends SimpleControllerSupport { - private final CompanyService companyService; + private final Converter converter = new Converter(); - public EmployeeController(EmployeeService service, CompanyService companyService) { + public EmployeeController(EmployeeService service) { super(service); - this.companyService = companyService; } @Override protected Function saveItemMapper() { - return item -> { - var employee = new Employee(); - employee.setId(item.getId()); - employee.setName(item.getName()); - employee.setAge(item.getAge()); - employee.setRole(Employee.Role.USER); - employee.setCompany(companyService.detailOrThrow(item.getCompanyId())); - return employee; - }; + return item -> converter.convert(item, Employee.class); } @Override protected Function listItemMapper() { - return employee -> new ListItem( - employee.getId(), - employee.getName(), - employee.getAge(), - employee.getRole() - ); + return employee -> converter.convert(employee, ListItem.class); } @Override protected Function detailItemMapper() { - return employee -> new DetailItem( - employee.getId(), - employee.getCompany().getId(), - employee.getName(), - employee.getAge(), - employee.getRole(), - employee.getCreatedTime(), - employee.getModifiedTime() - ); + return employee -> converter.convert(employee, DetailItem.class); } @Setter @@ -64,11 +46,15 @@ public class EmployeeController extends SimpleControllerSupport { + private final Converter converter = new Converter(); private final EmployeeService employeeService; public ReportController(ReportService service, EmployeeService employeeService) { @@ -25,43 +31,24 @@ public class ReportController extends SimpleControllerSupport saveItemMapper() { - return item -> { - var report = new Report(); - report.setId(item.getId()); - report.setScore(item.getScore()); - report.setLevel(item.getLevel()); - report.setEmployeeId(item.getEmployeeId()); - return report; - }; + return item -> converter.convert(item, Report.class); } @Override protected Function listItemMapper() { + var mapper = Mappers.getMapper(ListItem.Mapper.class); return report -> { var employee = employeeService.detailOrThrow(report.getEmployeeId()); - return new ListItem( - report.getId(), - employee.getId(), - employee.getName(), - report.getScore(), - report.getLevel() - ); + return mapper.map(report, employee); }; } @Override protected Function detailItemMapper() { + var mapper = Mappers.getMapper(DetailItem.Mapper.class); return report -> { var employee = employeeService.detailOrThrow(report.getEmployeeId()); - return new DetailItem( - report.getId(), - employee.getId(), - employee.getName(), - report.getScore(), - report.getLevel(), - report.getCreatedTime(), - report.getModifiedTime() - ); + return mapper.map(report, employee); }; } @@ -70,6 +57,7 @@ public class ReportController extends SimpleControllerSupport