Spring Boot 中 MapStruct 无法注入问题的解决与最佳实践

spring boot 中 mapstruct 无法注入问题的解决与最佳实践

本文旨在解决 Spring Boot 项目中使用 MapStruct 时遇到的无法自动注入 `Mapper` 接口的问题。我们将深入分析问题原因,提供详细的解决方案,并分享使用 MapStruct 的最佳实践,帮助开发者更高效地进行对象转换。

在使用 Spring Boot 和 MapStruct 进行对象映射时,可能会遇到 BetMapper 无法注入的问题,导致应用程序启动失败。以下将详细分析问题的原因并提供解决方案。

问题分析

错误信息表明 Spring 容器无法找到 BetMapper 类型的 Bean,导致 BetServiceMysql 构造函数注入失败。这通常是因为 MapStruct 处理器没有正确生成 BetMapper 接口的实现类,或者 Spring 容器没有扫描到该实现类。

解决方案

以下是解决此问题的步骤:

确认 MapStruct 依赖已添加:

确保你的 pom.xml 文件中包含了 MapStruct 的核心依赖和处理器依赖。

    org.mapstruct    mapstruct    ${org.mapstruct.version}    org.mapstruct    mapstruct-processor    ${org.mapstruct.version}    provided

请替换 ${org.mapstruct.version} 为你想要使用的 MapStruct 版本,例如 1.5.5.Final。

配置 Maven Compiler Plugin:

确保 maven-compiler-plugin 插件配置正确,并且包含了 MapStruct 处理器。 将以下内容添加到你的 pom.xml 文件中的 -> 节点中:

    org.apache.maven.plugins    maven-compiler-plugin    3.8.1             ${java.version}        ${java.version}                                    org.mapstruct                mapstruct-processor                ${org.mapstruct.version}                        

确保 ${java.version} 与你的项目使用的 Java 版本一致,例如 17 或 1.8。

检查 MapStruct 注解是否正确:

确保 BetMapper 接口使用了 @Mapper 注解,并且 componentModel 设置为 “spring”,这告诉 MapStruct 生成的实现类应该作为一个 Spring Bean。

无涯·问知 无涯·问知

无涯·问知,是一款基于星环大模型底座,结合个人知识库、企业知识库、法律法规、财经等多种知识源的企业级垂直领域问答产品

无涯·问知 40 查看详情 无涯·问知

@Mapper(componentModel = "spring")public interface BetMapper {    @Mapping(target = "id", source = "betRequest.betId")    Bet betResquetToEntity(BetRequest betRequest);    @Mapping(source = "id", target = "betId")    BetResponse entityToBetResponse(Bet bet);}

注意: @Mapping 注解中的 target 和 source 属性需要正确指定目标属性和源属性。根据提供的代码,betResquetToEntity 方法中,betRequest 对象本身并没有名为 betId 的属性,而 BetRequest 对象有一个 betId 属性,需要将 source 修改为 betRequest.betId。 另外,target指向的是Bet实体类的id属性,所以target改为”id”。

清理并重新构建项目:

在 IDE 中或者通过 Maven 命令清理并重新构建项目,确保 MapStruct 处理器能够正确生成 BetMapper 接口的实现类。

mvn clean install

检查 Spring Bean 扫描:

确保 Spring Boot 能够扫描到 BetMapper 接口的实现类。通常情况下,如果 BetMapper 接口和 BetServiceMysql 类位于 Spring Boot 应用的根包或其子包中,Spring Boot 会自动扫描到它们。 如果不在,需要通过 @ComponentScan 注解显式指定扫描路径。

检查构造函数注入:

@AllArgsConstructor(onConstructor = @__(@Autowired)) 注解可以简化构造函数注入。 确保lombok配置正确,并且项目中引入了lombok依赖。

                    org.projectlombok            lombok            true        

完整示例

以下是一个完整的示例,展示了如何使用 MapStruct 进行对象映射:

BetRequest.java

public class BetRequest {    private Long betId;    private Integer maxNumbersByUsers;    // Getters and setters    public Long getBetId() {        return betId;    }    public void setBetId(Long betId) {        this.betId = betId;    }    public Integer getMaxNumbersByUsers() {        return maxNumbersByUsers;    }    public void setMaxNumbersByUsers(Integer maxNumbersByUsers) {        this.maxNumbersByUsers = maxNumbersByUsers;    }}

BetResponse.java

public class BetResponse {    private Long betId;    private Integer maxNumbersByUsers;    // Getters and setters    public Long getBetId() {        return betId;    }    public void setBetId(Long betId) {        this.betId = betId;    }    public Integer getMaxNumbersByUsers() {        return maxNumbersByUsers;    }    public void setMaxNumbersByUsers(Integer maxNumbersByUsers) {        this.maxNumbersByUsers = maxNumbersByUsers;    }}

Bet.java

import javax.persistence.Entity;import javax.persistence.Id;@Entitypublic class Bet {    @Id    private Long id;    private Integer maxNumbersByUsers;    // Getters and setters    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public Integer getMaxNumbersByUsers() {        return maxNumbersByUsers;    }    public void setMaxNumbersByUsers(Integer maxNumbersByUsers) {        this.maxNumbersByUsers = maxNumbersByUsers;    }}

BetMapper.java

import org.mapstruct.Mapper;import org.mapstruct.Mapping;@Mapper(componentModel = "spring")public interface BetMapper {    @Mapping(target = "id", source = "betRequest.betId")    Bet betResquetToEntity(BetRequest betRequest);    @Mapping(source = "id", target = "betId")    BetResponse entityToBetResponse(Bet bet);}

BetServiceMysql.java

import lombok.AllArgsConstructor;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;import java.util.stream.Collectors;@Service@AllArgsConstructor(onConstructor = @__(@Autowired))public class BetServiceMysql implements BetService {    private BetRepository betRepository;    private BetMapper betMapper;    @Override    public List list() {        List bets = betRepository.findAll();        return bets.stream().map(bet -> betMapper.entityToBetResponse(bet)).collect(Collectors.toList());    }    @Override    public BetResponse save(BetRequest betRequest) {        Bet bet = betMapper.betResquetToEntity(betRequest);        betRepository.save(bet);        return betMapper.entityToBetResponse(bet);    }    @Override    public BetResponse update(Long id, BetRequest betRequest) {        Bet bet = verifyIfExist(id);        updateData(bet, betRequest);        betRepository.save(bet);        return betMapper.entityToBetResponse(bet);    }    @Override    public BetResponse delete(Long id) {        Bet bet = verifyIfExist(id);        betRepository.delete(bet);        return betMapper.entityToBetResponse(bet);    }    @Override    public BetResponse getBetById(Long id) {        // TODO Auto-generated method stub        return null;    }    @Override    public List getBets() {        // TODO Auto-generated method stub        return null;    }    protected Bet verifyIfExist(Long id){        return betRepository.findById(id).orElseThrow(() -> new EntityNotFoundException(String.format("ID: %s || Não foi encontrado nenhuma entidade para o id fornecido", id)));    }    protected void updateData(Bet bet, BetRequest betRequest){        bet.setMaxNumbersByUsers(betRequest.getMaxNumbersByUsers());    }}

注意事项

确保 MapStruct 版本与 Spring Boot 版本兼容。如果仍然遇到问题,可以尝试在 IDE 中启用 Annotation Processing 功能。仔细检查错误日志,了解更多详细信息。

总结

通过以上步骤,你应该能够解决 Spring Boot 中 MapStruct 无法自动注入的问题。 关键在于正确配置 MapStruct 依赖和处理器,并确保 Spring 容器能够扫描到 MapStruct 生成的实现类。 正确使用 MapStruct 可以大大简化对象映射的代码,提高开发效率。

以上就是Spring Boot 中 MapStruct 无法注入问题的解决与最佳实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/298858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 00:00:21
下一篇 2025年11月5日 00:05:49

相关推荐

  • 2025年十大潜力虚拟币分别是哪些币 下一个牛市会暴涨的币(收藏版)

    随着加密货币市场的周期性波动,投资者们正积极寻找下一个牛市中可能爆发的潜力项目。本文旨在梳理并分析2025年最具潜力的十大虚拟货币,它们或具备强大的技术基础,或拥有清晰的应用场景,有望在未来的市场浪潮中实现显著增长。 2025年比特币主流交易所: 欧易okx:   币安binance:   火币ht…

    2025年12月8日
    000
  • 什么是虚拟币高频交易?高频交易的原理与技术实现要点

    高频交易是虚拟币市场中技术含量最高、资本最密集的领域之一。它是一场关于速度、算法和尖端科技的竞赛,普通市场参与者难以涉足。了解其运作方式,有助于我们更深刻地认识到当前数字资产市场的复杂性和专业化程度。对于大多数人而言,认识并理解这一现象,比亲自尝试更为重要。 一、什么是高频交易(HFT)? 高频交易…

    2025年12月8日
    000
  • 区块链浏览器是什么?如何使用它追踪链上交易数据?

    区块链浏览器是Web3用户必备的链上查询工具,1、它作为去中心化世界的“搜索引擎”,让用户公开透明地验证区块链上的所有记录;2、核心功能包括查询交易详情、查看账户信息、探索区块数据和追踪智能合约;3、追踪交易时需获取交易哈希,选择对应公链的浏览器,输入哈希后查看状态、地址、金额和费用等详情;4、通过…

    2025年12月8日
    000
  • 哪些山寨币可能会继续上涨?

    1.以太坊(ETH)若突破并守住3300美元,有望在7月底前涨至3800美元,甚至突破4878美元历史高点;2.利尔佩佩(LILPEPE)作为模因币,受益于市场乐观情绪,可能继续上涨;3.瑞波币(XRP)在监管明朗后可能飙升600%,目标价13至15美元;4.卡尔达诺(ADA)因鲸鱼积累和活跃开发,…

    2025年12月8日
    000
  • 2025年7月第四周三大代币解锁:AVAIL、VENOM、ALT释放数亿美元筹码

    2025年7月第四周,加密货币市场将迎来三场备受瞩目的大额代币解锁事件,涉及avail、venom和altlayer项目。这些解锁预计将向市场释放价值数亿美元的流动性,可能对相关代币的价格和市场情绪产生显著影响,投资者需密切关注其动态。 2025年主流交易所: 欧易okx:   币安binance:…

    2025年12月8日
    000
  • OP币和ARB币哪个好?Layer2生态比较

    在以太坊高昂的gas费用和网络拥堵问题日益突出的背景下,layer2解决方案成为扩容热点。其中,op币(optimism)与arb币(arbitrum)作为两大rollup主力项目,一直被拿来对比。那么,它们哪个更值得新手关注和长期投资呢? 在深入比较前,建议新手用户先注册正规交易平台,方便查看币种…

    2025年12月8日
    000
  • 以太坊今日价格行情在哪里能看到?以太坊实时行情网站推荐

    随着以太坊生态的持续扩展,越来越多用户希望能随时掌握eth价格走势。查看实时行情不但能帮助了解币价变动,还能辅助判断买入与卖出的时机。下面推荐几个主流中文行情网站,适合日常查阅以太坊价格。 交易平台同步行情也值得参考 主流交易所平台App提供同步更新的以太坊实时价格,适合随时随地查看行情。 币安官网…

    2025年12月8日 好文分享
    000
  • 什么是算法稳定币?其价格稳定机制如何?与传统稳定币的区别在哪里?

    1、算法稳定币通过供应调节、智能合约控制、代币激励和预言机数据实现价格锚定1美元的稳定机制;2、主要支持平台包括欧意OKX 、Binance必安、火必HTX和Gate.io大门,分别提供交易流动性与新兴项目入口;3、与传统稳定币相比,其抵押方式为算法而非法币储备,去中心化程度更高,稳定性受市场情绪影…

    2025年12月8日
    000
  • 通过黄金交叉解析比特币走势图表,比特币会再创新高吗?

    目录 什么是黄金交叉,为何它在加密货币中如此重要?比特币图表解析:黄金交叉与150K美元的路径潜在交易设置更宏观的视角:宏观趋势推动牛市预期使用黄金交叉进行比特币价格预测的关键考量常见问题:黄金交叉与比特币价格前景1. 黄金交叉是什么?2. 比特币上次形成黄金交叉是什么时候?3. 黄金交叉是否保证价…

    2025年12月8日 好文分享
    000
  • ETH是什么币,中文怎么读

    ETH是以太坊区块链的原生加密货币,中文读作“以太币(Yǐ tài bì)”,用于支付网络手续费和价值交换;1. 币安:全球交易量最大,生态丰富,适合各类用户;2. 欧易:衍生品强,Web3账户集成高,金融产品多。 在探索数字货币的世界时,选择一个安全可靠的交易平台是首要任务。本文将为您介绍当前市场…

    好文分享 2025年12月8日
    000
  • 加密货币投资是什么?数字资产如何实现增值?它能成为主流投资选择吗?

    加密资产投资应选择主流平台并合理配置币种,1.推荐平台包括欧意OKX、Binance必安、火必HTX和Gate.io大门;2.热门币种为比特币(BTC)、以太坊(ETH)、Solana(SOL)、Toncoin(TON)、Polygon(MATIC)、Chainlink(LINK)、Arbitrum…

    2025年12月8日
    000
  • 2025目前最值得购买的加密货币有那些?五大潜力加密货币推荐

    比特币(BTC):每个加密货币投资组合的基础 ‍ 比特币作为最早且最广为人知的加密货币,常被誉为“数字黄金”。进入2025年,其市场表现再次惊艳全球,价格突破12.3万美元大关,刷新历史高点。凭借2100万枚的固定供应上限、去中心化的架构以及强大的网络安全机制,比特币已成为数字时代中备受青睐的价值储…

    2025年12月8日 好文分享
    000
  • 什么是Tether稳定币?其运行机制如何?与市场上其他稳定币有何区别?

    Tether是一种广泛使用的加密稳定币,旨在为用户提供与美元挂钩的数字资产体验。它通过1:1锚定美元价值,为数字资产交易提供稳定性。本文将介绍Tether的运行机制、与其他稳定币的差异,并对主流平台的使用场景进行简要对比。 一、主流平台的稳定币支持情况欧意OKX( ):支持USDT、USDC、DAI…

    2025年12月8日
    000
  • 什么是DAI稳定币?它如何维持价格稳定?与其他稳定币的差异在哪里?

    DAI是一种独特的去中心化稳定币,其价值与美元保持1:1锚定。它不依赖于中心化机构的储备,而是通过一个公开透明的链上资产抵押系统来维持其稳定性,这使其在众多稳定币中脱颖而出。DAI提供了一种更加原生于数字世界的解决方案。对于看重去中心化原则和链上可验证性的用户而言,DAI无疑是稳定币领域中一个值得关…

    2025年12月8日
    000
  • 数字货币和稳定币有什么区别

    数字货币与稳定币核心区别在于:数字货币波动性高、去中心化、价值源于供需与共识,用于投资和支付;稳定币价格锚定法币、波动小、是交易中转和DeFi基础,价值来自储备资产。了解这些差异有助于合理配置资产并选择合适平台进行交易。 数字货币与稳定币的区别 在数字资产领域,数字货币和稳定币是两种截然不同但又密切…

    2025年12月8日 好文分享
    000
  • 稳定币的利率怎么赚_抵押、借贷与质押收益方式

    一、稳定币也能赚利率?原理揭秘 稳定币因价格锚定法币,被广泛用于 defi 借贷、质押和流动性挖 矿中。用户可通过将稳定币提供给市场中有资金需求的一方,获得相应利息或奖励回报。其本质来源包括借贷利息、交易手续费分成、平台激励等。 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网…

    2025年12月8日
    000
  • 山寨币HIJ社群热度与媒体曝光度跟踪

    一、HIJ项目概述 hij 是近年来兴起的山寨币之一,主打跨链传输与低gas费用的技术优势。其社群活跃度与媒体关注程度成为评估其短期市场情绪和长期成长潜力的重要指标。 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安…

    2025年12月8日
    000
  • 狗狗币提现教程_如何从交易所兑换狗狗币?

    一、狗狗币提现教程前置准备 在开始提现操作前,你需要准备以下内容: 一个支持狗狗币的合法合规交易平台账户(如 OKX、Binance 等) Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: 已完成身份认证持…

    2025年12月8日
    000
  • 山寨币投资组合如何构建?分散风险的实用方法

    山寨币投资组合如何构建?分散风险的实用方法 一、%ignore_a_1%需要构建山寨币投资组合? 相较于比特币和以太坊,山寨币价格波动更大、项目生命周期不确定,风险更高。因此,构建合理的投资组合是控制回撤、获取稳健收益的关键策略。 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官…

    2025年12月8日
    000
  • NEAR协议的AI飞跃:双位数增长与未来潜力

    near 协议因人工智能融合、灰度基金吸纳及活跃用户数量飙升而迎来两位数增长,释放出强烈的看涨信号。 NEAR 协议的 AI 转型:双位数跃升背后的潜力 加密市场目光聚焦 NEAR!该协议凭借在人工智能领域的深度布局正引发广泛关注,价格强势上涨超 10%。我们来拆解这波行情的核心驱动力,并展望其未来…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信