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

Java利用MapStruct優(yōu)雅解決Bean映射難題的完全指南

 更新時間:2026年01月28日 09:27:40   作者:回家路上繞了彎  
在Java開發(fā)中,Bean映射是高頻場景,本文從基礎(chǔ)用法到進階擴展,全面拆解MapStruct的使用流程,助力開發(fā)者高效實現(xiàn)Bean映射,感興趣的小伙伴可以了解下

在Java開發(fā)中,Bean映射是高頻場景——無論是分層架構(gòu)中DTO與實體類的轉(zhuǎn)換,還是跨服務(wù)數(shù)據(jù)傳輸時的模型適配,都需要將一個對象的屬性值賦值到另一個對象。傳統(tǒng)方式通過手動編寫setter/getter或使用BeanUtils等反射工具,要么繁瑣冗余,要么存在性能隱患與類型安全問題。MapStruct作為一款編譯期生成Bean映射代碼的工具,以“類型安全、性能優(yōu)異、配置靈活”為核心優(yōu)勢,完美解決了這些痛點。本文從基礎(chǔ)用法到進階擴展,全面拆解MapStruct的使用流程,助力開發(fā)者高效實現(xiàn)Bean映射。

一、為什么選擇MapStruct?核心優(yōu)勢解析

在MapStruct出現(xiàn)之前,Java Bean映射主要有兩種方案,各有明顯短板:手動映射繁瑣易出錯,反射工具(BeanUtils、ModelMapper)性能差、類型不安全、難以處理復雜映射場景。MapStruct通過“編譯期生成靜態(tài)代碼”的設(shè)計,兼顧了開發(fā)效率與運行時性能,核心優(yōu)勢如下:

  • 類型安全:基于接口定義映射規(guī)則,編譯期校驗字段類型、名稱匹配性,避免運行時類型轉(zhuǎn)換異常;
  • 性能優(yōu)異:編譯期生成原生setter/getter代碼,無反射、無代理開銷,性能遠超BeanUtils等反射工具;
  • 配置靈活:支持字段名不一致映射、自定義轉(zhuǎn)換邏輯、嵌套對象映射、集合映射等復雜場景;
  • 低侵入性:無需修改目標Bean類,僅通過接口+注解配置映射規(guī)則,符合開閉原則;
  • 易于調(diào)試:生成的映射代碼可直接查看,問題定位清晰,優(yōu)于反射工具的黑盒操作。

選型建議:中小型項目簡單映射可臨時使用BeanUtils,但復雜業(yè)務(wù)場景、高性能要求場景,優(yōu)先選擇MapStruct;尤其在分層架構(gòu)(Controller-Service-Dao)中,DTO與實體類的轉(zhuǎn)換推薦全程使用MapStruct。

二、MapStruct基礎(chǔ)用法:快速上手

MapStruct的核心用法圍繞“映射接口+注解”展開,通過定義映射接口并添加注解,編譯期自動生成接口實現(xiàn)類,調(diào)用實現(xiàn)類方法即可完成Bean映射。以下以“訂單DTO與訂單實體類轉(zhuǎn)換”為例,演示完整流程。

1. 環(huán)境準備:引入依賴

MapStruct需引入核心依賴與編譯插件,支持Maven、Gradle構(gòu)建工具,以下以Maven為例:

<!-- MapStruct核心依賴 -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version> <!-- 穩(wěn)定版,可按需升級 -->
</dependency>

<!-- 編譯插件:生成映射實現(xiàn)類,必須配置 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>8</source> <!-- 對應(yīng)項目JDK版本 -->
                <target>8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.5.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

注意:MapStruct版本需與JDK版本適配,JDK8及以上推薦使用1.5.x系列版本;若項目使用Lombok,需確保Lombok依賴與MapStruct兼容,避免編譯沖突。

2. 定義映射對象(DTO與實體類)

創(chuàng)建訂單實體類(Order)與訂單DTO(OrderDTO),模擬字段名一致、不一致及類型差異場景:

// 訂單實體類(數(shù)據(jù)庫映射)
@Data
public class Order {
    private Long id; // 訂單ID
    private String orderNo; // 訂單編號
    private Long userId; // 用戶ID
    private BigDecimal amount; // 訂單金額
    private Integer status; // 訂單狀態(tài)(0-待支付,1-已支付)
    private LocalDateTime createTime; // 創(chuàng)建時間
}

// 訂單DTO(接口傳輸)
@Data
public class OrderDTO {
    private Long id; // 與實體類字段名一致
    private String orderNumber; // 與實體類orderNo字段名不一致
    private Long userId; // 與實體類字段名一致
    private String amount; // 與實體類類型不一致(實體類BigDecimal,DTO String)
    private String statusDesc; // 狀態(tài)描述(實體類無對應(yīng)字段,需自定義轉(zhuǎn)換)
    private String createTime; // 與實體類類型不一致(實體類LocalDateTime,DTO String)
}

3. 定義映射接口:核心配置

創(chuàng)建映射接口,通過@Mapper注解標識,使用@Mapping注解配置字段映射規(guī)則,MapStruct編譯期會生成該接口的實現(xiàn)類(如OrderMapperImpl)。

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

// @Mapper:標識該接口為MapStruct映射接口,componentModel = "spring"表示生成Spring Bean
@Mapper(componentModel = "spring")
public interface OrderMapper {
    // 實例化映射器(非Spring環(huán)境使用,Spring環(huán)境可通過@Autowired注入)
    OrderMapper INSTANCE = Mappers.getMapper(OrderMapper.class);

    // 實體類轉(zhuǎn)DTO:配置字段映射規(guī)則
    @Mapping(source = "orderNo", target = "orderNumber") // 字段名不一致:實體類orderNo -> DTO orderNumber
    @Mapping(source = "amount", target = "amount", dateFormat = "0.00") // 類型轉(zhuǎn)換:BigDecimal -> String,保留兩位小數(shù)
    @Mapping(source = "status", target = "statusDesc", expression = "java(convertStatus(order.getStatus()))") // 自定義表達式轉(zhuǎn)換狀態(tài)
    @Mapping(source = "createTime", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss") // 時間類型轉(zhuǎn)換:LocalDateTime -> String
    OrderDTO orderToOrderDTO(Order order);

    // DTO轉(zhuǎn)實體類:反向映射,字段規(guī)則可復用或單獨配置
    @Mapping(source = "orderNumber", target = "orderNo")
    @Mapping(source = "amount", target = "amount") // String -> BigDecimal,MapStruct自動轉(zhuǎn)換
    @Mapping(target = "status", ignore = true) // 忽略DTO的statusDesc字段,不映射到實體類
    @Mapping(source = "createTime", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    Order orderDTOToOrder(OrderDTO orderDTO);

    // 自定義狀態(tài)轉(zhuǎn)換方法(映射接口內(nèi)部可定義默認方法,供expression調(diào)用)
    default String convertStatus(Integer status) {
        if (status == null) {
            return "未知狀態(tài)";
        }
        return status == 0 ? "待支付" : "已支付";
    }
}

4. 調(diào)用映射方法:使用生成的實現(xiàn)類

MapStruct在編譯后會生成映射接口的實現(xiàn)類,類名格式為“接口名+Impl”,核心邏輯是原生setter/getter賦值,可直接調(diào)用或通過Spring注入使用。

Spring環(huán)境使用(推薦)

因映射接口添加了componentModel = "spring",生成的實現(xiàn)類會被注冊為Spring Bean,可通過@Autowired注入:

@Service
public class OrderServiceImpl {
    // 注入MapStruct生成的映射器
    @Autowired
    private OrderMapper orderMapper;

    public void testMapping() {
        // 構(gòu)建實體類對象
        Order order = new Order();
        order.setId(1L);
        order.setOrderNo("ORDER20260129001");
        order.setUserId(1003L);
        order.setAmount(new BigDecimal("399.50"));
        order.setStatus(0);
        order.setCreateTime(LocalDateTime.of(2026, 1, 29, 10, 30));

        // 實體類轉(zhuǎn)DTO
        OrderDTO orderDTO = orderMapper.orderToOrderDTO(order);
        System.out.println(orderDTO);
        // 輸出結(jié)果:OrderDTO(id=1, orderNumber=ORDER20260129001, userId=1003, amount=399.50, statusDesc=待支付, createTime=2026-01-29 10:30:00)

        // DTO轉(zhuǎn)實體類
        Order convertOrder = orderMapper.orderDTOToOrder(orderDTO);
        System.out.println(convertOrder);
        // 輸出結(jié)果:Order(id=1, orderNo=ORDER20260129001, userId=1003, amount=399.50, status=null, createTime=2026-01-29T10:30)
    }
}

非Spring環(huán)境使用

通過映射接口定義的INSTANCE常量獲取映射器實例,直接調(diào)用方法:

// 非Spring環(huán)境調(diào)用
public class MapStructTest {
    public static void main(String[] args) {
        Order order = new Order();
        // 填充order數(shù)據(jù)...

        // 獲取映射器實例
        OrderMapper mapper = OrderMapper.INSTANCE;
        // 實體類轉(zhuǎn)DTO
        OrderDTO orderDTO = mapper.orderToOrderDTO(order);
    }
}

5. 編譯期生成的實現(xiàn)類解析

MapStruct在編譯后會在target/classes目錄下生成映射實現(xiàn)類,核心邏輯為原生賦值,無反射開銷,示例如下(OrderMapperImpl):

// 編譯期自動生成的實現(xiàn)類
@Component
public class OrderMapperImpl implements OrderMapper {

    @Override
    public OrderDTO orderToOrderDTO(Order order) {
        if ( order == null ) {
            return null;
        }

        OrderDTO orderDTO = new OrderDTO();

        orderDTO.setId( order.getId() );
        orderDTO.setOrderNumber( order.getOrderNo() ); // 字段名映射
        orderDTO.setUserId( order.getUserId() );
        // BigDecimal轉(zhuǎn)String,按dateFormat格式處理
        if ( order.getAmount() != null ) {
            orderDTO.setAmount( new DecimalFormat( "0.00" ).format( order.getAmount() ) );
        }
        // 調(diào)用自定義convertStatus方法轉(zhuǎn)換狀態(tài)
        orderDTO.setStatusDesc( convertStatus( order.getStatus() ) );
        // LocalDateTime轉(zhuǎn)String,按dateFormat格式處理
        if ( order.getCreateTime() != null ) {
            orderDTO.setCreateTime( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" ).format( order.getCreateTime() ) );
        }

        return orderDTO;
    }

    // orderDTOToOrder方法實現(xiàn)類似,略...

    @Override
    public String convertStatus(Integer status) {
        // 自定義方法實現(xiàn),略...
    }
}

三、MapStruct進階技巧:處理復雜映射場景

1. 集合映射:List、Set等容器類型轉(zhuǎn)換

MapStruct支持集合類型(List、Set、Map)的自動映射,只需在映射接口中定義集合轉(zhuǎn)換方法,無需額外配置,底層會循環(huán)調(diào)用單對象映射方法。

@Mapper(componentModel = "spring")
public interface OrderMapper {
    // 單對象映射(已定義)
    OrderDTO orderToOrderDTO(Order order);

    // 集合映射:List<Order> -> List<OrderDTO>,MapStruct自動循環(huán)調(diào)用單對象方法
    List<OrderDTO> orderListToOrderDTOList(List<Order> orderList);

    // Set映射:Set<Order> -> Set<OrderDTO>
    Set<OrderDTO> orderSetToOrderDTOSet(Set<Order> orderSet);

    // Map映射:Map<Long, Order> -> Map<Long, OrderDTO>
    Map<Long, OrderDTO> orderMapToOrderDTOMap(Map<Long, Order> orderMap);
}

避坑提醒:集合映射需確保泛型類型的單對象映射方法已定義,否則編譯報錯;集合元素為null時,MapStruct會自動跳過,不會拋出空指針異常。

2. 嵌套對象映射:關(guān)聯(lián)對象轉(zhuǎn)換

當Bean中包含嵌套對象(如Order包含User對象)時,MapStruct支持嵌套對象的自動映射,可通過@Mapping注解配置嵌套字段映射規(guī)則。

// 嵌套對象:用戶實體類
@Data
public class User {
    private Long id;
    private String username;
    private String phone;
}

// 嵌套對象:用戶DTO
@Data
public class UserDTO {
    private Long id;
    private String userName; // 與實體類username字段名不一致
    private String phone;
}

// 訂單實體類(新增user字段,嵌套User對象)
@Data
public class Order {
    // 原有字段略...
    private User user; // 嵌套用戶對象
}

// 訂單DTO(新增userDTO字段,嵌套UserDTO對象)
@Data
public class OrderDTO {
    // 原有字段略...
    private UserDTO userDTO; // 嵌套用戶DTO對象
}

// 映射接口:配置嵌套對象映射
@Mapper(componentModel = "spring")
public interface OrderMapper {
    // 嵌套對象映射:User -> UserDTO
    @Mapping(source = "username", target = "userName")
    UserDTO userToUserDTO(User user);

    // 訂單映射:配置嵌套字段映射
    @Mapping(source = "user", target = "userDTO") // Order.user -> OrderDTO.userDTO
    @Mapping(source = "orderNo", target = "orderNumber")
    // 其他映射規(guī)則略...
    OrderDTO orderToOrderDTO(Order order);
}

3. 自定義類型轉(zhuǎn)換:處理特殊類型映射

對于MapStruct無法自動轉(zhuǎn)換的類型(如自定義枚舉、第三方工具類對象),可通過三種方式實現(xiàn)自定義轉(zhuǎn)換:接口默認方法、靜態(tài)方法、外部轉(zhuǎn)換器。

接口默認方法(簡單場景)

如前文狀態(tài)轉(zhuǎn)換示例,在映射接口中定義default方法,直接在@Mapping的expression中調(diào)用。

靜態(tài)方法(工具類場景)

通過靜態(tài)方法封裝轉(zhuǎn)換邏輯,在@Mapper注解中指定uses屬性引入工具類,MapStruct會自動調(diào)用靜態(tài)方法。

// 自定義轉(zhuǎn)換工具類(靜態(tài)方法)
public class DateConvertUtil {
    // 自定義時間轉(zhuǎn)換:LocalDateTime -> String(指定格式)
    public static String localDateTimeToString(LocalDateTime dateTime, String pattern) {
        if (dateTime == null || pattern == null) {
            return null;
        }
        return DateTimeFormatter.ofPattern(pattern).format(dateTime);
    }
}

// 映射接口引入工具類
@Mapper(componentModel = "spring", uses = {DateConvertUtil.class})
public interface OrderMapper {
    @Mapping(source = "createTime", target = "createTime", 
             expression = "java(DateConvertUtil.localDateTimeToString(order.getCreateTime(), "yyyy-MM-dd"))")
    OrderDTO orderToOrderDTO(Order order);
}

外部轉(zhuǎn)換器(復雜場景)

對于復雜轉(zhuǎn)換邏輯,可實現(xiàn)MapStruct提供的Converter接口,自定義轉(zhuǎn)換器類,在映射接口中引入。

// 自定義轉(zhuǎn)換器:BigDecimal -> String(支持多種格式)
public class BigDecimalToStringConverter implements Converter<BigDecimal, String> {
    @Override
    public String convert(BigDecimal source) {
        if (source == null) {
            return null;
        }
        // 金額大于1000添加千分位,否則保留兩位小數(shù)
        return source.compareTo(new BigDecimal("1000")) > 0 
                ? new DecimalFormat("#,##0.00").format(source)
                : new DecimalFormat("0.00").format(source);
    }
}

// 映射接口引入轉(zhuǎn)換器
@Mapper(componentModel = "spring", uses = {BigDecimalToStringConverter.class})
public interface OrderMapper {
    // 無需額外配置,MapStruct自動調(diào)用轉(zhuǎn)換器
    @Mapping(source = "amount", target = "amount")
    OrderDTO orderToOrderDTO(Order order);
}

4. 映射忽略與默認值:處理字段缺失場景

通過@Mapping注解的ignore屬性忽略無需映射的字段,通過defaultValue屬性設(shè)置默認值(當源字段為null時生效)。

@Mapper(componentModel = "spring")
public interface OrderMapper {
    @Mapping(target = "statusDesc", ignore = true) // 忽略該字段,不映射
    @Mapping(source = "orderNo", target = "orderNumber", defaultValue = "未知訂單號") // 源字段為null時,默認值為"未知訂單號"
    @Mapping(source = "createTime", target = "createTime", defaultValue = "2026-01-01 00:00:00")
    OrderDTO orderToOrderDTO(Order order);
}

5. 多源映射:合并多個對象到一個目標對象

MapStruct支持將多個源對象的屬性合并到一個目標對象,只需在映射方法中傳入多個源參數(shù),通過@Mapping指定每個字段的源對象。

// 合并Order與User對象到OrderDetailDTO
@Data
public class OrderDetailDTO {
    private Long orderId;
    private String orderNumber;
    private BigDecimal amount;
    private String username; // 來自User對象
    private String phone; // 來自User對象
}

@Mapper(componentModel = "spring")
public interface OrderDetailMapper {
    // 多源映射:將Order和User合并為OrderDetailDTO
    @Mapping(source = "order.id", target = "orderId")
    @Mapping(source = "order.orderNo", target = "orderNumber")
    @Mapping(source = "order.amount", target = "amount")
    @Mapping(source = "user.username", target = "username")
    @Mapping(source = "user.phone", target = "phone")
    OrderDetailDTO mergeOrderAndUserToDTO(Order order, User user);
}

四、MapStruct高頻避坑指南

1. 坑點1:編譯失敗,提示“找不到映射方法”

現(xiàn)象:編譯項目時,MapStruct提示“Can't map property ...”,無法生成實現(xiàn)類。 規(guī)避方案

  • 檢查源字段與目標字段的類型是否匹配,若不匹配需配置自定義轉(zhuǎn)換邏輯;
  • 集合映射需確保泛型對應(yīng)的單對象映射方法已定義,否則無法自動生成集合轉(zhuǎn)換邏輯;
  • 字段名不一致時,必須通過@Mapping注解指定source和target,否則MapStruct無法自動匹配。

2. 坑點2:與Lombok集成沖突,編譯后無映射實現(xiàn)類

現(xiàn)象:項目使用Lombok簡化Bean編寫,編譯后MapStruct未生成映射實現(xiàn)類,或提示字段找不到。 規(guī)避方案

  • 確保Lombok依賴版本與MapStruct兼容(Lombok 1.18.x+,MapStruct 1.5.x+);
  • Maven編譯插件中,調(diào)整注解處理器順序,將Lombok處理器放在MapStruct之前;
  • 避免在映射接口中使用Lombok注解,僅在Bean類中使用。

3. 坑點3:映射后字段值為null,未正確賦值

現(xiàn)象:調(diào)用映射方法后,目標對象部分字段值為null,源對象對應(yīng)字段有值。 規(guī)避方案

  • 檢查字段名是否一致,大小寫敏感,不一致需通過@Mapping配置;
  • 檢查源字段是否為null,若需默認值可通過defaultValue屬性設(shè)置;
  • 復雜類型(如嵌套對象、自定義枚舉)需確保轉(zhuǎn)換邏輯正確,或配置自定義轉(zhuǎn)換器。

4. 坑點4:時間類型轉(zhuǎn)換失敗,報格式異常

現(xiàn)象:LocalDateTime、Date等時間類型映射時,報格式轉(zhuǎn)換異常或字段值為null。 規(guī)避方案

  • 明確指定dateFormat格式,確保源時間字符串與格式匹配;
  • JDK8時間類型(LocalDateTime、LocalDate)與String轉(zhuǎn)換時,dateFormat格式需符合DateTimeFormatter規(guī)則;
  • 避免使用過時的Date類型,優(yōu)先使用JDK8時間類型,映射更穩(wěn)定。

5. 坑點5:Spring環(huán)境注入失敗,提示“找不到Bean”

現(xiàn)象:通過@Autowired注入映射器時,Spring提示NoSuchBeanDefinitionException,找不到對應(yīng)的Bean。 規(guī)避方案

  • 確保映射接口添加了@Mapper(componentModel = "spring"),否則生成的實現(xiàn)類不會被注冊為Spring Bean;
  • 檢查編譯后的target目錄,確認映射實現(xiàn)類已生成,且類上有@Component注解;
  • 避免映射接口與實現(xiàn)類不在Spring掃描范圍內(nèi),調(diào)整包路徑或掃描配置。

五、總結(jié):MapStruct使用核心原則

MapStruct的核心價值在于“編譯期生成高效代碼,優(yōu)雅解決Bean映射難題”,實際使用中需遵循以下原則,最大化發(fā)揮其優(yōu)勢:

  • 優(yōu)先依賴MapStruct自動映射能力,僅在字段名不一致、類型不匹配時添加注解配置,減少冗余代碼;
  • 復雜轉(zhuǎn)換邏輯優(yōu)先使用接口默認方法或外部轉(zhuǎn)換器,保持映射接口簡潔,便于維護;
  • 集成Lombok、Spring等框架時,注意版本兼容與配置規(guī)范,避免編譯沖突;
  • 映射前做好字段梳理,明確源與目標的對應(yīng)關(guān)系,提前規(guī)避字段名、類型不一致問題,減少調(diào)試成本。

相較于反射類映射工具,MapStruct雖需額外定義映射接口,但換來的是類型安全、高性能與可調(diào)試性,尤其在中大型項目中,能顯著提升代碼質(zhì)量與開發(fā)效率。掌握本文所述的基礎(chǔ)用法、進階技巧與避坑要點,可輕松應(yīng)對各類Bean映射場景,讓映射代碼更優(yōu)雅、更可靠。

以上就是Java利用MapStruct優(yōu)雅解決Bean映射難題的完全指南的詳細內(nèi)容,更多關(guān)于Java MapStruct解決Bean映射的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 實現(xiàn) Java 本地緩存的方法解析

    實現(xiàn) Java 本地緩存的方法解析

    這篇文章主要介紹了實現(xiàn) Java 本地緩存的方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java 字節(jié)碼與Smali 語法基礎(chǔ)實戰(zhàn)案例

    Java 字節(jié)碼與Smali 語法基礎(chǔ)實戰(zhàn)案例

    本文介紹了Java字節(jié)碼(.class)和DEX字節(jié)碼(.dex)的基本概念、轉(zhuǎn)換流程及優(yōu)化特性,對比了JVM和Dalvik虛擬機的區(qū)別,并詳細講解了Smali語法基礎(chǔ),感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • java 中設(shè)計模式之單例

    java 中設(shè)計模式之單例

    這篇文章主要介紹了java 中設(shè)計模式之單例的相關(guān)資料,這里說明惡漢模式與懶漢模式,需要的朋友可以參考下
    2017-08-08
  • java中年月日的加減法使用示例

    java中年月日的加減法使用示例

    這篇文章主要介紹了java中年月日的加減法使用示例的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Redis集群與SSM整合使用方法

    Redis集群與SSM整合使用方法

    這篇文章主要介紹了Redis集群與SSM整合使用方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 詳解Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗

    詳解Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗

    基于?Spring?Boot?,如何“優(yōu)雅”的進行數(shù)據(jù)校驗呢,本文將待大家詳細介紹Springboot如何優(yōu)雅的進行數(shù)據(jù)校驗,文中有詳細的代碼示例和流程步驟,需要的朋友可以參考下
    2023-06-06
  • 使用Java對PDF添加水印的操作代碼

    使用Java對PDF添加水印的操作代碼

    在當今數(shù)字化辦公環(huán)境中,PDF 文檔作為信息交流和存儲的重要載體,其安全性和版權(quán)保護變得尤為關(guān)鍵,企業(yè)常常需要對內(nèi)部敏感文檔或?qū)ν獍l(fā)布的資料添加水印,以防止未經(jīng)授權(quán)的使用,本文將為您揭示這一問題的解決方案,深入探討如何使用Java對PDF添加水印,需要的朋友可以參考下
    2025-10-10
  • SpringBoot從Nacos讀取MySQL數(shù)據(jù)庫配置錯誤:Public Key Retrieval is not allowed的解決方案

    SpringBoot從Nacos讀取MySQL數(shù)據(jù)庫配置錯誤:Public Key Retrieva

    最近的項目,突然都從MySQL5.7升級到8.0了,有些項目能運行成功,有些項目遇到了問題,啟動不成功,顯示數(shù)據(jù)庫方面的異常信息,本文給大家介紹了SpringBoot從Nacos讀取MySQL數(shù)據(jù)庫配置錯誤:Public Key Retrieval is not allowed的解決方案,需要的朋友可以參考下
    2024-04-04
  • Java 集合中的類關(guān)于線程安全

    Java 集合中的類關(guān)于線程安全

    這篇文章主要介紹了Java 集合中的類關(guān)于線程安全的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Spring Boot利用Thymeleaf發(fā)送Email的方法教程

    Spring Boot利用Thymeleaf發(fā)送Email的方法教程

    spring Boot默認就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關(guān)于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-08-08

最新評論

兴宁市| 拜城县| 叶城县| 崇信县| 邳州市| 灌云县| 威宁| 阿荣旗| 德州市| 浙江省| 普宁市| 玉门市| 太仆寺旗| 介休市| 时尚| 九台市| 武陟县| 安义县| 双牌县| 太原市| 洛扎县| 库车县| 闽清县| 凯里市| 德州市| 德钦县| 汕头市| 北碚区| 志丹县| 新野县| 忻州市| 诸城市| 灯塔市| 宜丰县| 呼伦贝尔市| 右玉县| 扬中市| 广饶县| 闽清县| 哈尔滨市| 张家界市|