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

时间:2021-01-06 08:24:11

标签: java mapstruct

我在我的项目中使用 mapstruct 并且它适用于直接的方式(所有映射器在一个包中)。 现在我需要将一个映射器移动到另一个包,但这效果不佳。

工作包结构(一):

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

不工作的包结构(2):

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

我的 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);
  }
}

尝试使用不同包中的映射器编译变体后,我收到以下错误消息: 无法将属性“Instant productionDate”映射到“LocalDateTime productionDate”。考虑声明/实现一个映射方法:“LocalDateTime map(Instant value)”。

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

编辑 生成包结构 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 个答案:

答案 0 :(得分:2)

它不工作的原因是因为 DateMapper 中的方法是包保护的,其他包不可用。

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