最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 中集成 Lombok 和 MapStruct最佳實踐指南

 更新時間:2025年08月25日 11:52:53   作者:三石成山  
文章詳解SpringBoot項目中Lombok與MapStruct整合實踐,涵蓋版本兼容、IDE配置、代碼分層、映射配置、測試驗證及性能優(yōu)化,重點解決注解沖突、依賴注入等常見問題,強調分層管理和組件掃描配置,提升開發(fā)效率與代碼簡潔性,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧

一、環(huán)境準備

1. 版本兼容性要求

組件最低版本要求推薦版本
Spring Boot2.2.x+3.1.x
Lombok1.18.16+1.18.28
MapStruct1.4.2.Final+1.5.5.Final
JavaJDK 8+JDK 17

2. IDE 插件安裝

  • ??IntelliJ IDEA??:
    • 安裝 Lombok 插件 (Settings → Plugins)
    • 啟用注解處理 (Settings → Build → Compiler → Annotation Processors)

二、項目配置

1. Maven 配置

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.28</version>
        <scope>provided</scope>
    </dependency>
    <!-- MapStruct -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.5.Final</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <annotationProcessorPaths>
                    <!-- Lombok 處理器 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.28</version>
                    </path>
                    <!-- MapStruct 處理器 -->
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.5.Final</version>
                    </path>
                    <!-- Lombok 與 MapStruct 的綁定器 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok-mapstruct-binding</artifactId>
                        <version>0.2.0</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

三、代碼實現

1. 實體類 (使用 Lombok)

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String username;
    private String email;
    private LocalDateTime createTime;
}

2. DTO 類

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
    private Long id;
    private String name;
    private String emailAddress;
    private String createTimeFormatted;
}

3. Mapper 接口 (使用 MapStruct)

@Mapper(componentModel = "spring", imports = {DateTimeFormatter.class})
public interface UserMapper {
    @Mapping(source = "username", target = "name")
    @Mapping(source = "email", target = "emailAddress")
    @Mapping(target = "createTimeFormatted", 
             expression = "java(entity.getCreateTime().format(DateTimeFormatter.ISO_DATE_TIME))")
    UserDto toDto(User entity);
    @Mapping(source = "name", target = "username")
    @Mapping(source = "emailAddress", target = "email")
    User toEntity(UserDto dto);
    // 集合映射
    List<UserDto> toDtoList(List<User> entities);
    // 更新現有實例
    @Mapping(target = "id", ignore = true)
    void updateFromDto(UserDto dto, @MappingTarget User entity);
}

4. 服務層使用示例

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserMapper userMapper;
    private final UserRepository userRepository;
    public UserDto getUserById(Long id) {
        return userMapper.toDto(
            userRepository.findById(id).orElseThrow()
        );
    }
    public List<UserDto> getAllUsers() {
        return userMapper.toDtoList(userRepository.findAll());
    }
    public UserDto createUser(UserDto userDto) {
        User user = userMapper.toEntity(userDto);
        return userMapper.toDto(userRepository.save(user));
    }
}

四、高級配置

1. 全局映射配置

@MapperConfig(
    componentModel = "spring",
    unmappedTargetPolicy = ReportingPolicy.IGNORE,
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE
)
public interface CentralConfig {}
// 在具體Mapper中引用
@Mapper(config = CentralConfig.class)
public interface ProductMapper {}

2. 自定義映射方法

@Mapper(componentModel = "spring")
public abstract class CustomMapper {
    // 自定義轉換邏輯
    protected String statusToString(Status status) {
        return status != null ? status.name() : "UNKNOWN";
    }
    // 抽象方法由MapStruct實現
    public abstract OrderDto toDto(Order entity);
}

3. 多源對象映射

@Mapper(componentModel = "spring")
public interface ComplexMapper {
    @Mapping(source = "user.username", target = "name")
    @Mapping(source = "profile.address", target = "location")
    @Mapping(source = "metadata.tags", target = "labels")
    CompositeDto mergeToDto(User user, UserProfile profile, Metadata metadata);
}

五、測試驗證

1. 單元測試示例

@SpringBootTest
public class UserMapperTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    void testToDto() {
        User user = User.builder()
            .id(1L)
            .username("john_doe")
            .email("john@example.com")
            .createTime(LocalDateTime.now())
            .build();
        UserDto dto = userMapper.toDto(user);
        assertEquals(user.getUsername(), dto.getName());
        assertEquals(user.getEmail(), dto.getEmailAddress());
        assertNotNull(dto.getCreateTimeFormatted());
    }
    @Test
    void testToEntity() {
        UserDto dto = UserDto.builder()
            .name("jane_doe")
            .emailAddress("jane@example.com")
            .build();
        User user = userMapper.toEntity(dto);
        assertEquals(dto.getName(), user.getUsername());
        assertEquals(dto.getEmailAddress(), user.getEmail());
    }
}

2. 集成測試

@WebMvcTest(UserController.class)
@Import(UserMapper.class) // 顯式導入Mapper
public class UserControllerIT {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private UserService userService;
    @Test
    void getUserById() throws Exception {
        UserDto mockDto = UserDto.builder().id(1L).name("test").build();
        when(userService.getUserById(any())).thenReturn(mockDto);
        mockMvc.perform(get("/api/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("test"));
    }
}

六、常見問題解決

1. Lombok 與 MapStruct 沖突

??現象??:編譯時報錯找不到 getter/setter
??解決??:

  1. 確保添加了 lombok-mapstruct-binding
  2. 檢查注解處理器順序 (Lombok 必須在 MapStruct 之前)

2. Spring 依賴注入失敗

??現象??:NoSuchBeanDefinitionException
??解決??:

  1. 確認 Mapper 接口有 @Mapper(componentModel = "spring")
  2. 檢查組件掃描范圍是否包含 Mapper 接口所在包

3. 集合映射問題

??現象??:集合映射為空
??解決??:

// 明確聲明集合映射方法
@Mapping(target = "items", source = "orderItems")
OrderDto toDto(Order entity);

4. 復雜類型轉換

??解決方案??:

@Mapper(componentModel = "spring")
public interface ComplexMapper {
    @Named("stringToDate")
    default LocalDate map(String dateStr) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ISO_DATE);
    }
    @Mapping(target = "birthDate", source = "birthDateStr", qualifiedByName = "stringToDate")
    PersonDto toDto(Person entity);
}

七、性能優(yōu)化

1. 編譯參數優(yōu)化

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgs>
            <arg>-Amapstruct.unmappedTargetPolicy=IGNORE</arg>
            <arg>-Amapstruct.defaultComponentModel=spring</arg>
            <arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
        </compilerArgs>
    </configuration>
</plugin>

2. 緩存映射器實例

@Mapper(componentModel = "spring")
public interface CachedMapper {
    @BeanMapping(resultType = CachedDto.class)
    CachedDto toCachedDto(Entity entity);
}

3. 批量映射優(yōu)化

public interface BatchMapper {
    @IterableMapping(elementTargetType = BatchDto.class)
    List<BatchDto> toBatchDtos(List<Entity> entities);
}

八、最佳實踐

  • ??分層管理 Mapper??:
    • 基礎映射放在 infrastructure/mapper 包
    • 業(yè)務特定映射放在對應業(yè)務模塊中
  • ??文檔生成??:
@Mapper(componentModel = "spring")
public interface DocumentedMapper {
    /**
     * 用戶實體轉DTO
     * @param entity 用戶實體
     * @return 用戶DTO
     */
    @Mapping(source = "username", target = "name")
    UserDto toDto(User entity);
}

??版本控制??:

public interface UserMapperV2 extends UserMapper {
    // 擴展或覆蓋方法
}

對重大變更創(chuàng)建 V2 版本映射器

通過以上配置和實踐,可以在 Spring Boot 項目中高效整合 Lombok 和 MapStruct,實現簡潔的代碼和高效的 DTO 轉換。

到此這篇關于Spring Boot 中集成 Lombok 和 MapStruct最佳實踐指南的文章就介紹到這了,更多相關Spring Boot 集成 Lombok 和 MapStruct內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析Java設計模式編程中的單例模式和簡單工廠模式

    淺析Java設計模式編程中的單例模式和簡單工廠模式

    這篇文章主要介紹了淺析Java設計模式編程中的單例模式和簡單工廠模式,使用設計模式編寫代碼有利于團隊協(xié)作時程序的維護,需要的朋友可以參考下
    2016-01-01
  • Spring?Boot自動配置源碼實例解析

    Spring?Boot自動配置源碼實例解析

    Spring Boot作為Java領域最為流行的快速開發(fā)框架之一,其核心特性之一就是其強大的自動配置機制,下面這篇文章主要給大家介紹了關于Spring?Boot自動配置源碼的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • Java設計模式之策略模式_動力節(jié)點Java學院整理

    Java設計模式之策略模式_動力節(jié)點Java學院整理

    策略模式是對算法的封裝,把一系列的算法分別封裝到對應的類中,并且這些類實現相同的接口,相互之間可以替換。接下來通過本文給大家分享Java設計模式之策略模式,感興趣的朋友一起看看吧
    2017-08-08
  • 深入了解Java中的過濾器Filter和監(jiān)聽器Listener

    深入了解Java中的過濾器Filter和監(jiān)聽器Listener

    這篇文章主要為大家詳細介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • Java多線程通信問題深入了解

    Java多線程通信問題深入了解

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • SpringBoot 如何自定義請求參數校驗

    SpringBoot 如何自定義請求參數校驗

    這篇文章主要介紹了SpringBoot 如何自定義請求參數校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解Springboot工程中如何快速判斷web應用服務器類型

    詳解Springboot工程中如何快速判斷web應用服務器類型

    在?Spring?Boot?工程中快速判斷?Web?應用服務器類型,可以從運行時環(huán)境、Spring?Boot?特有?API、底層類加載器、HTTP?響應和外部命令等多個層面入手,下面小編就和大家簡單介紹一下吧
    2026-04-04
  • Java基于socket實現簡易聊天室實例

    Java基于socket實現簡易聊天室實例

    這篇文章主要介紹了Java基于socket實現簡易聊天室的方法,實例分析了java基于socket實現聊天室服務端與客戶端的相關技巧,需要的朋友可以參考下
    2015-05-05
  • 圖解Spring框架的設計理念與設計模式

    圖解Spring框架的設計理念與設計模式

    這篇文章主要通過多圖詳細解釋Spring框架的設計理念與設計模式,需要的朋友可以參考下
    2015-08-08
  • Java字符串工具類從原生到第三方庫的高效實踐詳解

    Java字符串工具類從原生到第三方庫的高效實踐詳解

    字符串是我們在編程中最常使用的一種數據類型,Java中用類來描述字符串,其中最常用的字符串處理類是String,這篇文章主要介紹了Java字符串工具類從原生到第三方庫的高效實踐的相關資料,需要的朋友可以參考下
    2025-08-08

最新評論

济南市| 西乡县| 西和县| 德江县| 沙河市| 安福县| 苍南县| 滨海县| 西乌| 林甸县| 奉化市| 嘉义县| 棋牌| 宣恩县| 巩义市| 同德县| 电白县| 保亭| 恩平市| 延庆县| 上饶县| 霍城县| 交城县| 商河县| 盐城市| 新郑市| 通化市| 锦州市| 蒙阴县| 长垣县| 双辽市| 开江县| 金堂县| 廉江市| 镇沅| 肥乡县| 河池市| 鲁山县| 横峰县| 丹巴县| 巴东县|