Search code examples
javaspringmapstruct

Can't map property, Consider to declare/implement a mapping method


When I try to compile my application it shows me this error, the whole application was generated with Jhipster.

Detail Description Error: [ERROR] /C:/Users/user/Desktop/Devs/CURTIPIELES/curti-back/src/main/java/com/curtipieles/app/service/mapper/LeatherMapper.java:[21,16] Can't map property "com.curtipieles.app.domain.Usage leather.usage.usage" to "java.lang.String usageName". Consider to declare/implement a mapping method: "java.lang.String map(com.curtipieles.app.domain.Usage value)".

Error
image

This is my LeatherMapper:

@Mapper(componentModel = "spring", uses = {LeatherFamilyMapper.class, LeatherHasColorMapper.class, LeatherHasUsageMapper.class})
public interface LeatherMapper extends EntityMapper<LeatherDTO, Leather> {

    @Mapping(source = "family.id", target = "familyId")
    @Mapping(source = "family.name", target = "familyName")
    @Mapping(source = "color.id", target = "colorId")
    @Mapping(source = "color.id", target = "colorName")
    @Mapping(source = "usage.id", target = "usageId")
    @Mapping(source = "usage.usage", target = "usageName")
    LeatherDTO toDto(Leather leather);

    @Mapping(source = "familyId", target = "family")
    @Mapping(source = "colorId", target = "color")
    @Mapping(source = "usageId", target = "usage")
    Leather toEntity(LeatherDTO leatherDTO);

    default Leather fromId(Long id) {
        if (id == null) {
            return null;
        }
        Leather leather = new Leather();
        leather.setId(id);
        return leather;
    }
}

This is my LeatherDTO (I do not put the Getters And Setters so as not to lengthen the question so much)

public class LeatherDTO implements Serializable {
    private Long id;

    private String imageUrl;

    private String name;

    private String description;

    private Boolean status;

    private Instant creationDate;

    private Boolean isNew;


    private Long familyId;

    private String familyName;

    private Long colorId;

    private String colorName;

    private Long usageId;

    private String usageName;

This is my Leather Class:

@Entity
@Table(name = "leather")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Leather implements Serializable {
    private static final long serialVersionUID = 1L;

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

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

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

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

    @Column(name = "status")
    private Boolean status;

    @Column(name = "creation_date")
    private Instant creationDate;

    @Column(name = "is_new")
    private Boolean isNew;

    @ManyToOne
    @JsonIgnoreProperties(value = "leathers", allowSetters = true)
    private LeatherFamily family;

    @ManyToOne
    @JsonIgnoreProperties(value = "leathers", allowSetters = true)
    private LeatherHasColor color;

    @ManyToOne
    @JsonIgnoreProperties(value = "leathers", allowSetters = true)
    private LeatherHasUsage usage;

This is my LeatherHasUsage Class:

@Entity
@Table(name = "leather_has_usage")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class LeatherHasUsage implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @Column(name = "status")
    private Boolean status;

    @ManyToOne
    @JsonIgnoreProperties(value = "leatherHasUsages", allowSetters = true)
    private Usage usage;

    // jhipster-needle-entity-add-field - JHipster will add fields here
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Boolean isStatus() {
        return status;
    }

    public LeatherHasUsage status(Boolean status) {
        this.status = status;
        return this;
    }

This is my LeatherHasColor class:

@Entity
@Table(name = "leather_has_color")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class LeatherHasColor implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @Column(name = "status")
    private Boolean status;

    @ManyToOne
    @JsonIgnoreProperties(value = "leatherHasColors", allowSetters = true)
    private Color color;

This is my LeatherFamily class

@Entity
@Table(name = "leather_family")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class LeatherFamily implements Serializable {

    private static final long serialVersionUID = 1L;

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

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

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

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

    @Column(name = "status")
    private Boolean status;

    @Column(name = "is_new")
    private Boolean isNew;

    @Column(name = "creation_date")
    private Instant creationDate;

Solution

  • This was the solution to the problem

    You change "usage.usage" to "usage.usage.usage", and likely also change "usage.id" to "usage.usage.id", since you seemingly forgot you have an extra level of object, and do similar change for color, and your code should be all fixed. - comment by Andreas