1
0

feat: 使用record作为vo更加便捷

This commit is contained in:
2025-08-24 19:19:32 +08:00
parent c7350da73a
commit fa85423f13
6 changed files with 600 additions and 185 deletions

View File

@@ -12,7 +12,6 @@ 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;
@@ -35,7 +34,6 @@ 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";

View File

@@ -2,77 +2,69 @@ 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;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("company")
public class CompanyController extends SimpleControllerSupport<Company, CompanyController.SaveItem, CompanyController.ListItem, CompanyController.DetailItem> {
private static final Converter converter = new Converter();
public CompanyController(CompanyService service) {
super(service);
}
@Override
protected Function<SaveItem, Company> saveItemMapper() {
return item -> converter.convert(item, Company.class);
return item -> {
var company = new Company();
company.setId(item.id());
company.setName(item.name());
company.setMembers(item.members());
return company;
};
}
@Override
protected Function<Company, ListItem> listItemMapper() {
return company -> converter.convert(company, ListItem.class);
return company -> new ListItem(
company.getId(),
company.getName(),
company.getMembers()
);
}
@Override
protected Function<Company, DetailItem> detailItemMapper() {
return company -> converter.convert(company, DetailItem.class);
return company -> new DetailItem(
company.getId(),
company.getName(),
company.getMembers(),
company.getCreatedTime(),
company.getModifiedTime()
);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Company.class, reverseConvertGenerate = false)
public static class SaveItem {
private Long id;
private String name;
private Integer members;
public record SaveItem(
Long id,
String name,
Integer members
) {
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Company.class, convertGenerate = false)
public static class ListItem {
private Long id;
private String name;
private Integer members;
public record ListItem(
Long id,
String name,
Integer members
) {
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Company.class, convertGenerate = false)
public static class DetailItem {
private Long id;
private String name;
private Integer members;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
public record DetailItem(
Long id,
String name,
Integer members,
LocalDateTime createdTime,
LocalDateTime modifiedTime
) {
}
}

View File

@@ -3,87 +3,82 @@ package com.lanyuanxiaoyao.service.template.controller;
import com.lanyuanxiaoyao.service.template.entity.Employee;
import com.lanyuanxiaoyao.service.template.service.CompanyService;
import com.lanyuanxiaoyao.service.template.service.EmployeeService;
import io.github.linpeilie.Converter;
import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMapping;
import io.github.linpeilie.annotations.ReverseAutoMapping;
import java.time.LocalDateTime;
import java.util.function.Function;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("employee")
public class EmployeeController extends SimpleControllerSupport<Employee, EmployeeController.SaveItem, EmployeeController.ListItem, EmployeeController.DetailItem> {
private final Converter converter = new Converter();
private final CompanyService companyService;
public EmployeeController(EmployeeService service) {
public EmployeeController(EmployeeService service, CompanyService companyService) {
super(service);
this.companyService = companyService;
}
@Override
protected Function<SaveItem, Employee> saveItemMapper() {
return item -> converter.convert(item, Employee.class);
return item -> {
var employee = new Employee();
employee.setId(item.id());
employee.setName(item.name());
employee.setAge(item.age());
employee.setRole(Employee.Role.USER);
employee.setCompany(companyService.detailOrThrow(item.companyId()));
return employee;
};
}
@Override
protected Function<Employee, ListItem> listItemMapper() {
return employee -> converter.convert(employee, ListItem.class);
return employee -> new ListItem(
employee.getId(),
employee.getName(),
employee.getAge(),
employee.getRole()
);
}
@Override
protected Function<Employee, DetailItem> detailItemMapper() {
return employee -> converter.convert(employee, DetailItem.class);
return employee -> new DetailItem(
employee.getId(),
employee.getCompany().getId(),
employee.getName(),
employee.getAge(),
employee.getRole(),
employee.getCreatedTime(),
employee.getModifiedTime()
);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Employee.class, uses = CompanyService.class, reverseConvertGenerate = false)
public static class SaveItem {
private Long id;
@AutoMapping(target = "company", qualifiedByName = "detailOrThrow")
private Long companyId;
private String name;
private Integer age;
@AutoMapping(defaultValue = "USER")
private Employee.Role role;
public record SaveItem(
Long id,
Long companyId,
String name,
Integer age,
Employee.Role role
) {
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Employee.class, convertGenerate = false)
public static class ListItem {
private Long id;
private String name;
private Integer age;
private Employee.Role role;
public record ListItem(
Long id,
String name,
Integer age,
Employee.Role role
) {
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Employee.class, convertGenerate = false)
public static class DetailItem {
private Long id;
@ReverseAutoMapping(source = "company.id")
private Long companyId;
private String name;
private Integer age;
private Employee.Role role;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
public record DetailItem(
Long id,
Long companyId,
String name,
Integer age,
Employee.Role role,
LocalDateTime createdTime,
LocalDateTime modifiedTime
) {
}
}

View File

@@ -1,27 +1,16 @@
package com.lanyuanxiaoyao.service.template.controller;
import com.lanyuanxiaoyao.service.template.entity.Employee;
import com.lanyuanxiaoyao.service.template.entity.Report;
import com.lanyuanxiaoyao.service.template.service.EmployeeService;
import com.lanyuanxiaoyao.service.template.service.ReportService;
import io.github.linpeilie.Converter;
import io.github.linpeilie.annotations.AutoMapper;
import java.time.LocalDateTime;
import java.util.function.Function;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("report")
public class ReportController extends SimpleControllerSupport<Report, ReportController.SaveItem, ReportController.ListItem, ReportController.DetailItem> {
private final Converter converter = new Converter();
private final EmployeeService employeeService;
public ReportController(ReportService service, EmployeeService employeeService) {
@@ -31,83 +20,71 @@ public class ReportController extends SimpleControllerSupport<Report, ReportCont
@Override
protected Function<SaveItem, Report> saveItemMapper() {
return item -> converter.convert(item, Report.class);
return item -> {
var report = new Report();
report.setId(item.id());
report.setScore(item.score());
report.setLevel(item.level());
report.setEmployeeId(item.employeeId());
return report;
};
}
@Override
protected Function<Report, ListItem> listItemMapper() {
var mapper = Mappers.getMapper(ListItem.Mapper.class);
return report -> {
var employee = employeeService.detailOrThrow(report.getEmployeeId());
return mapper.map(report, employee);
return new ListItem(
report.getId(),
employee.getId(),
employee.getName(),
report.getScore(),
report.getLevel()
);
};
}
@Override
protected Function<Report, DetailItem> detailItemMapper() {
var mapper = Mappers.getMapper(DetailItem.Mapper.class);
return report -> {
var employee = employeeService.detailOrThrow(report.getEmployeeId());
return mapper.map(report, employee);
return new DetailItem(
report.getId(),
employee.getId(),
employee.getName(),
report.getScore(),
report.getLevel(),
report.getCreatedTime(),
report.getModifiedTime()
);
};
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@AutoMapper(target = Report.class, reverseConvertGenerate = false)
public static class SaveItem {
private Long id;
private Double score;
private Report.Level level;
private Long employeeId;
public record SaveItem(
Long id,
Double score,
Report.Level level,
Long employeeId
) {
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class ListItem {
private Long id;
private Long employeeId;
private String employeeName;
private Double score;
private Report.Level level;
@org.mapstruct.Mapper
public interface Mapper {
@Mapping(target = "id", source = "report.id")
@Mapping(target = "employeeId", source = "employee.id")
@Mapping(target = "employeeName", source = "employee.name")
ListItem map(Report report, Employee employee);
}
public record ListItem(
Long id,
Long employeeId,
String employeeName,
Double score,
Report.Level level
) {
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class DetailItem {
private Long id;
private Long employeeId;
private String employeeName;
private Double score;
private Report.Level level;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
@org.mapstruct.Mapper
public interface Mapper {
@Mapping(target = "id", source = "report.id")
@Mapping(target = "employeeId", source = "employee.id")
@Mapping(target = "employeeName", source = "employee.name")
@Mapping(target = "createdTime", source = "report.createdTime")
@Mapping(target = "modifiedTime", source = "report.modifiedTime")
DetailItem map(Report report, Employee employee);
}
public record DetailItem(
Long id,
Long employeeId,
String employeeName,
Double score,
Report.Level level,
LocalDateTime createdTime,
LocalDateTime modifiedTime
) {
}
}