首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JHipster web应用程序中的Mapstruct生成的类不是由Spring注入的

基础概念

MapStruct 是一个 Java 映射框架,用于简化对象之间的映射过程。它通过注解处理器生成映射代码,从而避免了手动编写繁琐的映射逻辑。在 JHipster 中,MapStruct 通常用于实体(Entity)和 DTO(Data Transfer Object)之间的转换。

相关优势

  1. 性能:MapStruct 在编译时生成映射代码,运行时性能优于反射。
  2. 类型安全:由于在编译时生成代码,MapStruct 提供了更好的类型安全性。
  3. 易于维护:生成的代码简洁明了,易于理解和维护。

类型

MapStruct 支持多种类型的映射,包括但不限于:

  • 基本数据类型
  • 枚举
  • 集合
  • 自定义对象

应用场景

MapStruct 常用于以下场景:

  • 实体(Entity)和 DTO(Data Transfer Object)之间的转换
  • 不同层之间的数据传输
  • 数据格式转换

问题描述

在 JHipster web 应用程序中,MapStruct 生成的类不是由 Spring 注入的,导致无法在服务中使用这些类。

原因

MapStruct 生成的类默认是普通的 Java 类,而不是 Spring 管理的 Bean。因此,Spring 容器无法自动注入这些类。

解决方法

要解决这个问题,可以通过以下几种方法:

方法一:使用 @Mapper(componentModel = "spring")

在 MapStruct 的 Mapper 接口上添加 @Mapper(componentModel = "spring") 注解,这样 MapStruct 会生成 Spring 管理的 Bean。

代码语言:txt
复制
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(source = "firstName", target = "name")
    UserDTO userToUserDTO(User user);
}

方法二:手动注册 Bean

如果不想使用 @Mapper(componentModel = "spring"),可以手动将生成的 Mapper 类注册为 Spring Bean。

代码语言:txt
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MapStructConfig {

    @Bean
    public UserMapper userMapper() {
        return Mappers.getMapper(UserMapper.class);
    }
}

示例代码

假设有一个 User 实体和一个 UserDTO DTO:

代码语言:txt
复制
public class User {
    private Long id;
    private String firstName;
    private String lastName;
    // getters and setters
}

public class UserDTO {
    private Long id;
    private String name;
    // getters and setters
}

定义一个 MapStruct 的 Mapper 接口:

代码语言:txt
复制
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(source = "firstName", target = "name")
    UserDTO userToUserDTO(User user);
}

在服务中使用这个 Mapper:

代码语言:txt
复制
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserMapper userMapper = UserMapper.INSTANCE;

    public UserDTO getUserDTO(User user) {
        return userMapper.userToUserDTO(user);
    }
}

参考链接

通过以上方法,可以确保 MapStruct 生成的类被 Spring 正确注入和管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Service 有多个实现,怎么注入

Spring存在一个接口(或抽象)有多个实现时,我们可以使用@Qualifier注解来指定要注入实现。...本文将介绍在这种情况下如何正确注入Service多个实现,以下是相关内容整理: 摘要 本文将探讨在Spring应用,当一个Service接口有多个实现时,如何通过使用@Qualifier注解来正确地注入所需实现...引言 在使用Spring框架开发应用程序时,很常见一个接口拥有多个不同实现。这样情况在需要根据不同业务逻辑或需求来选择不同实现时很有用。...要确保注入类型与要注入实现相匹配。 如果没有使用@Qualifier,Spring可能会在多个实现中选择一个默认,这可能不是我们期望结果。...总结 在Spring应用,当一个Service接口有多个实现时,使用@Qualifier注解可以帮助我们明确地注入所需实现,从而更好地管理不同业务逻辑组件。

66110
  • springboot第4集:springboot模块化开发与项目搭建流程

    拦截器:在子模块添加拦截器,扩展应用程序功能,如记录请求日志、权限校验、异常处理等。 Web 层:在子模块添加控制器,实现 HTTP 请求和响应,处理 Web 层相关业务逻辑。...服务层:在子模块添加服务,封装具体业务逻辑,被 Web 层调用。 存储库层:在子模块添加存储库接口,用于访问数据库或其他数据存储方式,如 Redis、Elasticsearch 等。...异常处理:在子模块添加异常处理,处理应用程序中出现异常情况,如参数校验失败、数据库访问异常等。...org.mapstruct:mapstruct-processor 也是 MapStruct依赖项。该库提供了编译时生成代码功能,以便进行更好类型检查和保证正确性。... 元素设置为 "provided",表示这个依赖项编译器或部署环境提供,而不是 Maven 提供。

    71231

    如何在非Spring容器管理注入获取 Spring容器 Bean?

    如何在非Spring容器管理注入/获取 Spring容器 Bean? 前言:此文仅限新手入行,大佬回避。...我们在使用Spring开发程序时候,Spring提供了很方便对象管理方式,即IOC,而且也提供了非常友好便捷对象注入方式DI, 只要是被Spring容器所管理,就可以使用@Resource或者...@Autowired注解将其他被Spring容器管理注入进来。...不了解可以看看小简写这一篇: 将Bean交给Spring容器管理几种方式 在非Spring管理怎么办? 有时候我们就是需要在非Spring管理中使用Bean怎么办呢?...比如我这一篇: 踩坑篇之WebSocket实现无法使用@Autowired注入对象 解决方法 我们定义一个上下文类,在Spring将Bean全部扫描完成后,我们去使用去实现ApplicationContextAware

    4.3K40

    快速上手JHipster (Java Hipster)创建应用

    原博文地址:https://www.shuibo.cn/blogs/8 timg.jpg JHipster简单来看是一个代码生成器,能够快速创建基于Spring Boot + AngularJS应用程序...: mkdir myapplication 转到该目录: cd myapplication/ 要生成应用程序,请键入: jhipster 接下出现交互回答,根据开发者要求生成代码 Which type...这目前在BETA测试(而不是在Windows上运行),但这最终会比运行内存更好,因为在应用程序重新启动时您不会丢失数据。.../java 目录有Spring Boot 配置在config包JHipster使用SpringJava 配置,没有XML配置。...REST 端点存在web.rest 包, 支持Spring MVCREST JHipster也产生 Liquibase 改变日志文件,用来处理数据库更新,增加一个实体将创建特定schema更新,这将会版本化

    7.1K190

    第5章—构建Spring Web应用程序—关于springvalidate注解后台校验解析

    关于springvalidate注解后台校验解析 在后台开发过程,对参数校验成为开发环境不可缺少一个环节。...比如参数不能为null,email那么必须符合email格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间、成本、质量博弈必然会落后。...所以把校验层抽象出来是必然结果,下面说下几种解决方案。...constraintViolation.getMessage()); } return messageList; } } 2.SpringMVC应用...: 实体注解还是和Student一样,只是controller接值时候需要做点改动如下: // 使用@Valid 表明获取到数据模型需要验证,传入Errors对象就是验证出错之后数据对象,

    52610

    Spring Security入门3:Web应用程序常见安全漏洞

    四、XSS 跨站脚本 4.1 什么是 XSS 跨站脚本(Cross-Site Scripting,XSS)是一种常见Web应用程序安全漏洞,攻击者通过注入恶意脚本代码(通常是JavaScript)到受信任网页...6.1 SQL 注入 SQL注入是一种常见Web应用程序安全漏洞,攻击者通过在用户输入数据中注入恶意SQL代码,从而改变原始SQL查询逻辑,绕过应用程序输入验证,执行恶意SQL查询操作。...为了防止 SQL 注入,开发者应该采取以下措施,防止 SQL 注入问题出现。 使用参数化查询或预编译语句,可以将用户输入作为参数而不是直接拼接到SQL查询语句中。...6.2 OS 命令注入 OS(操作系统)命令注入是一种常见Web应用程序安全漏洞,攻击者通过在用户输入数据中注入恶意操作系统命令,以执行未经授权操作。...6.3 LDAP 注入 LDAP(轻量级目录访问协议)注入是一种常见 Web 应用程序安全漏洞,攻击者通过在用户输入数据中注入恶意 LDAP 查询代码,绕过应用程序输入验证,执行恶意 LDAP

    42380

    Spring Security入门3:Web应用程序常见安全漏洞

    四、XSS 跨站脚本 4.1 什么是 XSS 跨站脚本(Cross-Site Scripting,XSS)是一种常见Web应用程序安全漏洞,攻击者通过注入恶意脚本代码(通常是JavaScript)到受信任网页...6.1 SQL 注入 SQL注入是一种常见Web应用程序安全漏洞,攻击者通过在用户输入数据中注入恶意SQL代码,从而改变原始SQL查询逻辑,绕过应用程序输入验证,执行恶意SQL查询操作。...为了防止 SQL 注入,开发者应该采取以下措施,防止 SQL 注入问题出现。 使用参数化查询或预编译语句,可以将用户输入作为参数而不是直接拼接到SQL查询语句中。...6.2 OS 命令注入 OS(操作系统)命令注入是一种常见Web应用程序安全漏洞,攻击者通过在用户输入数据中注入恶意操作系统命令,以执行未经授权操作。...6.3 LDAP 注入 LDAP(轻量级目录访问协议)注入是一种常见 Web 应用程序安全漏洞,攻击者通过在用户输入数据中注入恶意 LDAP 查询代码,绕过应用程序输入验证,执行恶意 LDAP

    36960

    实体映射最强工具MapStruct 真香!

    /setter也能赋值 8.使用Spring依赖注入 9.自定义类型转换 ---- 首先来了解一下DTO,DTO简单理解就是做数据传输对象,类似于VO,但是VO用于传输到前端。...MapStruct对象属性转换接口,在这个里面规定转换规则    *          在项目构建时,会自动生成改接口实现,这个实现将实现对象属性值复制    */   @Mapper   public...UserRoleDto 为目标,user为源,调用此方法,会把源属性更新到目标。...MapStruct自动生成代码: @Generated(       value = "org.mapstruct.ap.MappingProcessor",       date = "2019...,如果使用了例如像spring这样环境,Mapper引入uses实例方式将是自动注入,那么这个也应该纳入Spring容器: CustomerMapper.java指定使用spring @Mapper

    10.5K12

    实体映射最强工具MapStruct 真香!

    ;      /**    * @Mapper 定义这是一个MapStruct对象属性转换接口,在这个里面规定转换规则    *          在项目构建时,会自动生成改接口实现,这个实现将实现对象属性值复制...MapStruct对象属性转换接口,在这个里面规定转换规则    *          在项目构建时,会自动生成改接口实现,这个实现将实现对象属性值复制    */   @Mapper   public...UserRoleDto 为目标,user为源,调用此方法,会把源属性更新到目标。...MapStruct自动生成代码: @Generated(       value = "org.mapstruct.ap.MappingProcessor",       date = "2019...,如果使用了例如像spring这样环境,Mapper引入uses实例方式将是自动注入,那么这个也应该纳入Spring容器: CustomerMapper.java指定使用spring @Mapper

    1.2K30

    第三十章:SpringBoot使用MapStruct自动映射DTO

    MapStruct是一种类型安全bean映射生成java注释处理器。 我们要做就是定义一个映射器接口,声明任何必需映射方法。在编译过程MapStruct生成此接口实现。...该实现使用纯java方法调用源和目标对象之间映射,MapStruct节省了时间,通过生成代码完成繁琐和容易出错代码逻辑。...方式配置 Spring方式我们需要在@Mapper注解内添加componentModel属性值,配置后在外部可以采用@Autowired方式注入Mapper实现完成映射方法调用。...Spring方式获取Mapper如下所示: //注解配置 @Mapper(componentModel = "spring") //注入Mapper实现 @Autowired private GoodInfoMapper...我们采用了Spring方式获取Mapper,在自动生成实现MapStruct为我们自动添加了@ComponentSpring声明式注入注解配置。

    5.3K70

    Java 近期新闻:虚拟线程、JReleaser 1.0、Loom 项目、关于 Spring4Shell 供应商声明

    这个最新版本特性是对ForkJoinPool进行了更新,这样可以提高在消息传递等情况下性能。...JetBrains 关于 JetBrains 产品声明: 我们与产品团队一起对 JetBrains Web 应用程序进行了审计,包括产品有:YouTrack、Hub、TeamCity、Space,...JHipster 在 7.8.0 版本发布了一周之后,JHipster 7.8.1 版发布了,其中包括:许多库升级;并修复了 CVE-2022-24815 漏洞,即在创建带有响应式 SQL 后端应用程序时进行...SQL 注入漏洞。...Kotlin JetBrains 发布了 Kotlin 1.6.20,其特性包括:支持在 Kotlin/JVM 定义上下文相关声明;改进了与通用 Java 和接口互操作性;在 JVM IR 后端并行编译单个模块

    99420

    MapStruct

    /** * @Mapper 定义这是一个MapStruct对象属性转换接口,在这个里面规定转换规则 * 在项目构建时,会自动生成改接口实现,这个实现将实现对象属性值复制...; /** * @Mapper 定义这是一个MapStruct对象属性转换接口,在这个里面规定转换规则 * 在项目构建时,会自动生成改接口实现,这个实现将实现对象属性值复制...UserRoleDto 为目标,user为源,调用此方法,会把源属性更新到目标。...MapStruct自动生成代码: @Generated( value = "org.mapstruct.ap.MappingProcessor", date = "2019-02...,如果使用了例如像spring这样环境,Mapper引入uses实例方式将是自动注入,那么这个也应该纳入Spring容器: CustomerMapper.java指定使用spring @Mapper

    2.8K00

    【小家SpringSpring环境(含Boot环境),web组件(Servlet、Filter)内注入使用Spring容器里Bean

    前言 在日常web开发,我们经常会使用到Filter,这个组件最经典使用场景就是鉴权。...所以根本原因是: 过滤器是servlet规范定义,并不归Spring容器管理,也无法直接注入springBean 有了这个解释,小伙伴们就很好理解为何你在Spring Boot环境下使用Filter...容器里是存在HelloFilter这个Bean 这样是不好使,因为这样子在Spring容器里Filter和Servlet容器里不是同一个Bean,没用。...但下面这样方案是能正常work,因为它是同一个Bean: 方案二:DelegatingFilterProxy DelegatingFilterProxy存在与spring-web,其作用就是一个...这样如果filter需要一些Spring容器实例,可以通过spring直接注入 默认情况下, Spring 会到 IOC 容器查找和 对应 filter bean.

    2.4K21

    Java 近期新闻:JNoSQL 1.0、Liberica NIK 23.0、Micronaut 4.0-RC2、KCDC

    定义from()方法在 Kotlin 应用程序难以使用;SSL 配置会覆盖来自WebClient接口其他自定义项;支持 JDK 20,但在JavaVersion枚举没有为其定义值。...Spring Modulith 1.0.0 第一个里程碑版本 提供了 Bug 修复、依赖项升级和一个新特性(默认将应用程序定义ExecutorService接口实例传播到Scenario实例...类似地,Apache Camel 3.14.9发布,修复了以下 Bug:在FileConverter中使用FilescreateTempFile()方法,而不是直接创建文件;在 Woodstox...;为提升启动速度,使用 Java ServiceLoader来加载插件,而不是通过路径扫描;通过使用 Java LongAdder和类似的并发来避免Calculator同步,改进许多线程频繁生成采样器时计算过程...JHipster JHipster 团队 发布 了 JHipster Lite 0.35.0,修复了 Bug,完善了文档,升级了依赖项,改进了 Sonar 分析,提供了更多错误细节和一个等待选项。

    19330

    对象拷贝 - 优雅解决方案 Mapstruct

    MapStruct 拥有的优点: 使用普通方法调用而不是反射来快速执行,他会在编译器生成相应 Impl 方法调用时直接通过简单 getter/setter调用而不是反射或类似的方式将值从源复制到目标...componentModel = "spring" 该配置表示生成实现默认加上 spring @Component 注解,使用时可直接通过 @Autowire 进行注入 public interface...无法生成从一种类型到另一种类型特定映射,有如下两种实现方法 : 方法1> 在另一个上实现此类方法,然后由 MapStruct 生成映射器使用该方法 方法2> 在Java 8或更高版本时,可以直接在映射器界面实现自定义方法作为默认方法...在这种情况下,MapStruct生成抽象扩展,并实现所有抽象方法。...可以调用在其他定义映射方法,无论是MapStruct生成映射器还是手写映射方法 # 手动实现映射 public class DateMapper {     public String

    6.8K20

    你居然不知道MapStruct

    可能你第一反应就是使用SpringBeanUtils.copyProperties (),但是BeanUtils.copyProperties ()只能转换字段名字一样且类型一样字段。...(实际测试实际测试SpringBeanUtils在生成 次数为1000000时需要1.6秒,而使用MapStruct仅需要69毫秒)。...写一个Mapper接口StudentMapper,此处Mapper注解不是MyBtaisMapper注解。 接下来测试一下,看一下生成结果。...6.依赖注入 某些时候尤其是在做项目时,我们用到了Sping,希望映射后新实例是交给Spring管理。这时候就需要进行依赖注入了。...指定工厂,同时在Mapper接口中@Mapper注解上加入工厂class 输出如下 11.自定义映射 在某些情况下,可能需要定制生成映射方法,在目标对象设置一个无法MapStruct生成方法实现时

    2.4K31
    领券