MapStruct 是一个 Java 映射框架,用于简化对象之间的映射过程。它通过注解处理器生成映射代码,从而避免了手动编写繁琐的映射逻辑。在 JHipster 中,MapStruct 通常用于实体(Entity)和 DTO(Data Transfer Object)之间的转换。
MapStruct 支持多种类型的映射,包括但不限于:
MapStruct 常用于以下场景:
在 JHipster web 应用程序中,MapStruct 生成的类不是由 Spring 注入的,导致无法在服务中使用这些类。
MapStruct 生成的类默认是普通的 Java 类,而不是 Spring 管理的 Bean。因此,Spring 容器无法自动注入这些类。
要解决这个问题,可以通过以下几种方法:
@Mapper(componentModel = "spring")
在 MapStruct 的 Mapper 接口上添加 @Mapper(componentModel = "spring")
注解,这样 MapStruct 会生成 Spring 管理的 Bean。
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(componentModel = "spring")
,可以手动将生成的 Mapper 类注册为 Spring Bean。
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:
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 接口:
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:
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 正确注入和管理。
领取专属 10元无门槛券
手把手带您无忧上云