Mapstruct问题:未知属性错误,但存在属性

时间:2019-06-12 09:43:56

标签: java lombok mapstruct

我正在使用:

  • spring-boot 2.1.5.RELEASE
  • mapstruct 1.3.0.Final
  • 龙目岛1.18.8

并且我正在尝试映射两个对象,即Model和DTO:

  • DTO ClientDto-作为依赖从nesux存储库获取
  • 模型客户端
在两个类中的

都有一个属性沉降中心,但是在编译时出现错误(方法为toDto):

error: Unknown property "settlementCentre" in result type ru.rt.eip.boot.domain.ClientDto. Did you mean "null"?

但是如果我直接在我的项目中创建ClientDto类(而不是作为依赖项),编译就不会出现问题。

令人惊讶的是,但是toModel方法可以正常工作,编译后我在生成的源代码中看到下一个:

@Override
Client toModel(ClientDto clientDto) {
    if ( clientDto == null ) {
        return null;
    }

    Client client = new Client();

    if ( clientDto.getSettlementCentre() != null ) {
        client.setSettlementCentre( settlementCentreDtoToSettlementCentre( clientDto.getSettlementCentre() ) );
    }
    else {
        client.setSettlementCentre( null );
    }
}

我不知道如何解决此映射问题。有人可以帮忙吗?

这是我的映射器:

@Mapper(
        componentModel = "spring",
        unmappedTargetPolicy = ReportingPolicy.IGNORE,
        uses = {EntityIdMapper.class,
                LegalFormMapper.class,
                EmployeeMapper.class,
                SettlementTypeMapper.class,
                TrippingDisabledReasonMapper.class,
                ProprietaryFormMapper.class,
                BillingGroupMapper.class,
                SettlementCentreMapper.class,
                ClientClassMapper.class,
                ClientCategoryMapper.class,
                DepartmentMapper.class},
        injectionStrategy = InjectionStrategy.CONSTRUCTOR
)
public abstract class ClientMapper {

    @Mappings({
            @Mapping(source = "client.parent.id", target = "parentId"),
            @Mapping(target = "isVip", defaultValue = "false"),
            @Mapping(target = "isSpecial", defaultValue = "false"),
            @Mapping(target = "includeToDebtor", defaultValue = "false"),
            @Mapping(target = "excludeFromInform", defaultValue = "false"),
            @Mapping(source = "client.passport", target = "passport", defaultExpression = "java(null)"),
            @Mapping(source = "client.trippingDisabledReason", target = "trippingDisabledReason", defaultExpression = "java(null)"),
            @Mapping(source = "client.proprietaryForm", target = "proprietaryForm", defaultExpression = "java(null)"),
            @Mapping(source = "client.billingGroup", target = "billingGroup", defaultExpression = "java(null)"),
            @Mapping(source = "client.clientClass", target = "clientClass", defaultExpression = "java(null)"),
            @Mapping(source = "client.settlementCentre", target = "settlementCentre")
    })
    abstract ClientDto toDto(Client client);

    @Mapping(source = "clientDto.settlementCentre", target = "settlementCentre", defaultExpression = "java(null)")
    abstract Client toModel(final ClientDto clientDto);
}

DTO-ClientDto:

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ClientDto implements BusinessObject, WithParent {
    private EntityIdDto id;
    private String dtype;
    @Deprecated //SystemInfo
    private Long currentVersion;
    private String juridicalType;
    private String nls;
    private String nlsAdditional;
    private String inn;
    private String kpp;
    private String title;
    private String shortName;
    private String juridicalName;
    private String email;
    private String phone;
    private Boolean isVip;
    @Deprecated //SystemInfo
    private Boolean isDeleted;
    private Boolean isSpecial;
    private LocalDateTime changeDate;
    @Deprecated //SystemInfo
    private LocalDateTime persistDate;
    @Deprecated //SystemInfo
    private LocalDateTime endDate;
    @Deprecated //SystemInfo
    private LocalDateTime localsystemdatesnapshot;
    private String settlementAccount;
    private String bik;
    private String contact;
    private String companyUrl;
    private String inetSystemCode;
    private Boolean includeToDebtor;
    private Boolean excludeFromInform;
    private String deliveryArea;
    private String passport;
    private String fldFilialName;
    private String fldDocumentUnId;
    @Deprecated //parent
    private EntityIdDto parentId;
    private DepartmentDto department;
    private DepartmentDto ownerFilial;
    private SettlementTypeDto settlementType;
    private ClientClassB2BDto clientClassB2B;
    private String fldClientAttributes;
    private String regionId;
    @Deprecated // Address
    private Map<String, AddressDto> adresses;
    @Deprecated // ClientCategory
    private Map<String, ClientCategoryDto> clientCategories;
    private ServiceClassDto serviceClass;
    private String className;
    private LegalFormDto legalForm;
    private EmployeeDto employee;
    private String lastName;
    private String firstName;
    private String middleName;
    private String gender;
    private LocalDate birthday;
    private ClientTypeDto clientType;
    private ClientDto parent;
    private AddressDto postAddress;
    private AddressDto lawAddress;
    private AddressDto deliveryAddress;
    private ClientCategoryDto clientCategory;
    private ClientCategoryDto clientCategorySub;
    private ClientCategoryDto clientCategoryMacro;
    private SystemInfoDto systemInfo;
    private DeliveryInfoDto deliveryInfo;
    private TrippingDisabledReasonDto trippingDisabledReason;
    private ProprietaryFormDto proprietaryForm;
    private DocumentTypeDto documentType;
    private BillingGroupDto billingGroup;

    private SettlementCentreDto settlementCentre;

    private ClientClassDto clientClass;
    private ContractDto contract;
    private String okved;
    private String okpo;
    private String ogrn;
    private String docNumber;
    private String birthPlace;
}

模型-客户端

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Builder
@Table(name = "CLIENT")
public class Client {
    @EmbeddedId
    private EntityId id;
    @Column(name = "DTYPE")
    private String dtype;
    @Column(name = "JURIDICALTYPE")
    private String juridicalType;
    @Column(name = "NLS")
    private String nls;
    @Column(name = "NLSADDITIONAL")
    private String nlsAdditional;
    @Column(name = "INN")
    private String inn;
    @Column(name = "KPP")
    private String kpp;
    @Column(name = "TITLE")
    private String title;
    @Column(name = "SHORTNAME")
    private String shortName;
    @Column(name = "JURIDICALNAME")
    private String juridicalName;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "PHONE")
    private String phone;
    @Column(name = "VIP")
    private Boolean isVip;
    @Column(name = "ISSPECIAL")
    private Boolean isSpecial;
    @Column(name = "CHANGEDATE")
    private LocalDateTime changeDate;
    @Column(name = "SETTLEMENTACCOUNT")
    private String settlementAccount;
    @Column(name = "BIK")
    private String bik;
    @Column(name = "PASSPORT")
    private String passport;
    @Column(name = "CONTACT")
    private String contact;
    @Column(name = "COMPANYURL")
    private String companyUrl;
    @Column(name = "INETSYSTEMCODE")
    private String inetSystemCode;
    @Column(name = "INCLUDETODEBTOR")
    private Boolean includeToDebtor;
    @Column(name = "EXCLUDEFROMINFORM")
    private Boolean excludeFromInform;
    @Column(name = "DELIVERYAREA")
    private String deliveryArea;
    @Column(name = "FLDFILIALNAME")
    private String fldFilialName;
    @Column(name = "FLDDOCUMENTUNID")
    private String fldDocumentUnId;
    @Column(name = "FLDCLIENTATTRIBUTES")
    private String fldClientAttributes;
    @Column(name = "LASTNAME")
    private String lastName;
    @Column(name = "FIRSTNAME")
    private String firstName;
    @Column(name = "MIDDLENAME")
    private String middleName;
    @Column(name = "GENDER")
    private String gender;
    @Column(name = "BIRTHDAY")
    private LocalDate birthday;

    @Column(name = "BIRTHPLACE")
    private String birthPlace;
    @Column(name = "OKVED")
    private String okved;
    @Column(name = "OKPO")
    private String okpo;
    @Column(name = "OGRN")
    private String ogrn;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "PARENT_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "PARENT_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "PARENT_VERSION", referencedColumnName = "VERSION")})
    private Client parent;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "DEPARTMENT_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "DEPARTMENT_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "DEPARTMENT_VERSION", referencedColumnName = "VERSION")})
    private Department department;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "OWNERFILIAL_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "OWNERFILIAL_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "OWNERFILIAL_VERSION", referencedColumnName = "VERSION")})
    private Department ownerFilial;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "SETTLEMENTTYPE_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "SETTLEMENTTYPE_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private SettlementType settlementType;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "CLIENTCLASSB2B_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "CLIENTCLASSB2B_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private ClientClassB2B clientClassB2B;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "POSTADDRESS_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "POSTADDRESS_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "POSTADDRESS_VERSION", referencedColumnName = "VERSION")})
    private Address postAddress;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "LAWADDRESS_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "LAWADDRESS_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "LAWADDRESS_VERSION", referencedColumnName = "VERSION")})
    private Address lawAddress;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "DELIVERYADDRESS_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "DELIVERYADDRESS_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "DELIVERYADDRESS_VERSION", referencedColumnName = "VERSION")})
    private Address deliveryAddress;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "CC_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "CC_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private ClientCategory clientCategory;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "CCS_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "CCS_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private ClientCategory clientCategorySub;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "CCM_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "CCM_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private ClientCategory clientCategoryMacro;
    @OneToMany(mappedBy = "client")
    private List<Contract> contracts;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "SERVICECLASS_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "SERVICECLASS_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "SERVICECLASS_VERSION", referencedColumnName = "VERSION")})
    private ServiceClass serviceClass;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "MANAGER_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "MANAGER_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "MANAGER_VERSION", referencedColumnName = "VERSION")})
    private Employee employee;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "LEGALFORM_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "LEGALFORM_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "LEGALFORM_VERSION", referencedColumnName = "VERSION")})
    private LegalForm legalForm;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "CLIENTTYPE_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "CLIENTTYPE_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private ClientType clientType;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "TDR_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "TDR_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private TrippingDisabledReason trippingDisabledReason;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "BILLINGGROUP_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "BILLINGGROUP_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID")})
    private BillingGroup billingGroup;
    private SettlementCentre settlementCentre;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "PROPRIETARYFORM_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "PROPRIETARYFORM_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "PROPRIETARYFORM_VERSION", referencedColumnName = "VERSION")})
    private ProprietaryForm proprietaryForm;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "CLIENTCLASS_APP_PKID", referencedColumnName = "APP_PKID"),
            @JoinColumn(name = "CLIENTCLASS_LOCALSYSTEMID", referencedColumnName = "LOCALSYSTEMID"),
            @JoinColumn(name = "CLIENTCLASS_VERSION", referencedColumnName = "VERSION")})
    private ClientClass clientClass;

    @Embedded
    private SystemInfo systemInfo;
}

1 个答案:

答案 0 :(得分:2)

这是MapStruct中的已知错误。以set开头的流利的二传手已删除开头的set,因此settlementDate成为tlementDate。这就是为什么在删除Lombok @Builder时起作用的原因,然后它在对象而不是构建器上使用吸气剂/吸气剂。

您可以跟踪mapstruct/mapstruct#1799来解决问题。