首页
学习
活动
专区
工具
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 正确注入和管理。

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

相关·内容

领券