当前位置: 首页 > 知识库问答 >
问题:

Mapstruct-如何将DTO字符串参数转换为实体对象?

凌永逸
2023-03-14

我是Mapstruct的新手,我正在努力正确理解它。

我想实现的是从DTO字符串参数(carModel)转换为他的实体,使用服务和存储库进行检索。

问题是Mapstruct生成的Mapper类正在尝试向Service类注入@Autow的注释,但它不起作用。服务为空。

这是我的@Mapper课程:

@Mapper(componentModel = "spring", uses = CarModelService.class)
public interface KitMapper extends EntityMapper<KitDTO, Kit> {
    KitMapper INSTANCE = Mappers.getMapper(KitMapper.class);

    @Mapping(source = "weight", target = "systemWeight")
    @Mapping(source = "carModel", target = "carModel")
    Kit toEntity(KitDTO kitDTO);
}

public interface EntityMapper<D, E> {
    E toEntity(D dto);
    List<E> toEntity(List<D> dtoList);
}

@服务类:

@Service
@Transactional
public class CarModelService {
    private final CarModelRepository carModelRepository;

    @Transactional(readOnly = true)
    public CarModel findByName(String name) {
        return carModelRepository.findByName(name).orElse(null);
    }
}

@Repository类:

@Repository
public interface CarModelRepository extends JpaRepository<CarModel, Long> {
    Optional<CarModel> findByName(String carModelName);
}

DTO和实体类:

public class KitDTO {
    private String id;
    private String carModel; // e.g. "Ferrari Monza"
    ....
}
@Entity
@Table(name = "kit")
public class Kit implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    @Column(name = "id")
    private Long id;

    @ManyToOne
    private CarModel carModel;

    ...
}
@Entity
@Table(name = "car_model")
public class CarModel implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    ...
}

构建工作正常,但当我尝试使用Mapper时,应用程序停止。它说carModelService是空的。以下是mapper生成的实现类:

@Component
public class KitMapperImpl implements KitMapper {

    @Autowired // <-- this seems not working
    private CarModelService carModelService;

    @Override
    public Kit toEntity(KitDTO kitDTO) {
        if ( kitDTO == null ) {
            return null;
        }

        Kit kit = new Kit();

        kit.setSystemWeight( String.valueOf( kitDTO.getWeight() ) );
        kit.carModel( carModelService.findByName(kitDTO.getCarModel()) ); // <-- carModelService is null!

        // other setters

        return kit;
    }
}

我尝试过很多方法,使用Decorator、@Context、expression,将@Mapper类注入@Service类。

我发现了很多问题,但实际上没有人帮我:

Mapstruct-如何在Generated Mapper类中注入Spring依赖项

@服务类未在组织中自动连接。mapstruct@映射器类

调试时未使用autowired初始化MapStruct mapper

任何帮助都将不胜感激!提前感谢!

共有1个答案

穆鸿波
2023-03-14

你能分享一下错误信息吗?从您共享的信息中,我可以看到KitDto中的carModel是String,实体中的carModel是carModel类。不确定mapstruct的自动生成实现类是如何实现这个:kit的。carModel(carModelService.findByName(kitDTO.getCarModel())

但我想分享另一种方法,不知道这是否是最佳实践。在这种方法中,您可以创建一个Abstract mapper类,其中@Autowired repository可以手动添加这些映射。我分享了它的片段。希望这能对你有所帮助。

    @Mapper(componentModel = "spring", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public abstract class ProductMapper {
    @Autowired 
    private CarModelService carModelService;
    
    public abstract Kit convertDTOToEntity(KitDTO kitDTO);
    
       public Kit toEntity(KitDTO kitDTO);
        {   
        Kit kit = convertDTOToEntity(kitDTO);
        kit.setCarModel(carModelService.findByName(kitDTO.getCarModel()));
        return kit;
        }
    }

 类似资料:
  • 我试图使用MapStruct创建一个“PersondTo”类到“PersonEntity”的映射器 无法将属性“java.util.List Cars”映射到“com.example.car.CarEntity Cars”。考虑声明/实现一个映射方法:“com.example.car.carEntity map(java.util.List value)”。 如果我从Person类中删除“加法器”

  • 我的 Spring Boot 应用程序中有 实体。它具有字段 ,其中包含: 对于我我有,字段称为。问题是:如何使用将字符串字段转换为中的Map?

  • 问题内容: 我想获取一串字符串并将其转换为单词对流。例如: 我有: 我想要:。 这几乎与Zipping相同,如使用带有Lambda的JDK8的Zipping流中概述的那样(java.util.stream.Streams.zip) 但是,这会产生: 以下代码有效,但显然是错误的方法(不是线程安全的等): 问题答案: 如果你: 不喜欢使用流中所有字符串创建列表的想法 不想使用外部库 喜欢弄脏你的手

  • 好的,我有三个实体:主题、用户、类别、图片。用户有图片,主题有用户和类别。 我还有一个话题要讲 我可以将ModelMapper注入TopicService,并使用它进行转换,但它不能按照我的需要工作,在这种情况下,如果我试图将Topic转换为TopicDTO,在转换后的TopicDTO对象中,UserDTO和CategoryTo将为null,但在调试中,在转换之前,在Topic对象中,Catego

  • 我找了无数的问题。但大多数问题如下。 实体- 但我不想这样。 若Dto中不存在实体中的属性值,我想知道如何将Dto转换为实体。 没有为[annotations,Lombok,jpa,…]指定代码,但是它存在! userService的所有方法都返回DTO。如何在Post实体中设置用户实体?我收到一个userDto返回,它只有用户名。 这种时候我该怎么办? 存储库不是直接从控制器调用的。 服务将无条

  • 问题内容: 我正在阅读有关python的新f字符串的 博客 ,它们看起来很整洁。但是,我希望能够从字符串或文件中加载f字符串。 我似乎找不到任何执行此操作的字符串方法或其他函数。 从上面我的链接中的示例: 但是,如果我有琴弦怎么办?我希望能够像这样: 事实证明,我已经可以执行类似的操作并获得性能提高。即: 问题答案: f字符串是代码。不仅以安全的方式(当然,字符串文字就是代码),而且以危险的任意代