【问题标题】:mapstruct - Use mapper from another packagemapstruct - 使用另一个包中的映射器
【发布时间】:2021-01-06 18:42:17
【问题描述】:

我在我的项目中使用 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 的生成 CarMapperImpl.java 文件添加到我的原始帖子中。

标签: java mapstruct


【解决方案1】:

它不起作用的原因是DateMapper中的方法是包保护的,不能从其他包中获得。

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

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2020-06-16
    • 2021-11-29
    • 2020-08-02
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多