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

mapstruct-使用来自另一个包的映射器

充普松
2023-03-14

我在我的项目中使用了mapstruct,它可以直接工作(所有的mapper都在一个包中)。现在我有了将一个映射器移动到另一个包的要求,但这并不能很好地工作。

de.zinnchen
├── dto
│   └── Car.java
├── entity
│   └── CarEntity.java
└── mapper
    └── a
        ├── CarMapper.java
        └── DateMapper.java
de.zinnchen
├── dto
│   └── Car.java
├── entity
│   └── CarEntity.java
└── mapper
    ├── a
    │   └── CarMapper.java
    └── b
        └── DateMapper.java
package de.zinnchen.dto;

import java.time.LocalDateTime;

public class Car {

  private String manufacturer;
  private String model;
  private String color;
  private LocalDateTime productionDate;
...
package de.zinnchen.entity;

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;

public class CarEntity {
  private String manufacturer;
  private String model;
  private String color;
  private Instant productionDate;
...
package de.zinnchen.mapper.a;

import de.zinnchen.dto.Car;
import de.zinnchen.entity.CarEntity;
import de.zinnchen.mapper.b.DateMapper;
import org.mapstruct.Mapper;

@Mapper(
    uses = DateMapper.class
)
public interface CarMapper {


  Car asDto(CarEntity entity);

  CarEntity asEntity(Car car);

}
package de.zinnchen.mapper.b;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;

public class DateMapper {

  LocalDateTime instantToLocalDateTime(Instant instant) {
    return instant
        .atZone(ZoneId.of("UTC"))
        .toLocalDateTime();
  }

  Instant LocalDateTimeToInstant(LocalDateTime localDateTime) {
    return localDateTime.toInstant(ZoneOffset.UTC);
  }
}

你能帮我解决这个问题吗?

编辑包结构1的结果CarMapperImpl.java:

package de.zinnchen.mapper.a;

import de.zinnchen.dto.Car;
import de.zinnchen.entity.CarEntity;
import javax.annotation.processing.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-01-06T09:36:43+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.9.1 (AdoptOpenJDK)"
)
public class CarMapperImpl implements CarMapper {

    private final DateMapper dateMapper = new DateMapper();

    @Override
    public Car asDto(CarEntity entity) {
        if ( entity == null ) {
            return null;
        }

        Car car = new Car();

        car.setManufacturer( entity.getManufacturer() );
        car.setModel( entity.getModel() );
        car.setColor( entity.getColor() );
        car.setProductionDate( dateMapper.instantToLocalDateTime( entity.getProductionDate() ) );

        return car;
    }

    @Override
    public CarEntity asEntity(Car car) {
        if ( car == null ) {
            return null;
        }

        CarEntity carEntity = new CarEntity();

        carEntity.setManufacturer( car.getManufacturer() );
        carEntity.setModel( car.getModel() );
        carEntity.setColor( car.getColor() );
        carEntity.setProductionDate( dateMapper.LocalDateTimeToInstant( car.getProductionDate() ) );

        return carEntity;
    }
}

共有1个答案

竺焕
2023-03-14

它不能工作的原因是datemapper中的方法受包保护,不能从其他包中使用。

因此,如果您将public添加到方法中,那么它就会起作用。

 类似资料:
  • 我想把一个模型对象映射到dto模型。我已经有一个对象的映射器。我如何在另一个类中的另一个映射器中重用这个映射器? 我有下面的模型 这是我的地图 我希望将History映射到HistoryDynamo并重用IdentifierMapper映射HistoryDynamo中的一个对象。如何在ToHistoryDynamo中使用toIdentifierDynamo?

  • 我想用Kotlin中的Mapstruct将实体映射到带有嵌套DTO的DTO。 在Java中,这是这样的:。 应该如何使用Kotlin实现它?

  • 我有一个映射器,对于目标类的特定属性,需要从源对象内的对象列表中选择一个,并使用不同的映射器类对其进行映射。 简化了很多,类包含一个对象列表,我的类如下所示: 问题是,被生成为中的code>属性,但不是,因此生成失败,因为MapStruct找不到。 我最好的猜测是,这是由于在中没有其他方法显式地使用,因此Mapstrt决定不需要它,并且没有在实现中注入它。 那么,是否有任何方法可以强制MapSTR

  • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?

  • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?