Java ModelMapper: сопоставьте DTO с классом объектов EmbeddedId

#java #modelmapper

#java #modelmapper

Вопрос:

Я хочу знать, возможно ли сопоставить DTO с классом объектов с составным pk. Я читал документацию ModelMapper о PropertyMap, но я не могу заставить ее работать.

Вот код:

PlanDTO:

 public class PlanDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    private String formula;
    private String frequency;
    private String pricingtable;
    // getters and setters omitted
  

ПланИд:

 @Embeddable
public class PlanId implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    public BillingPlanId() { }
    public PlanId(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    // getters and setters omitted
}
  

План:

 @Entity
@Table(name = "plan")
public class Plan implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    private PlanId id;
    @Column(name = "formula")
    private String formula;
    @Column(name = "frequency")
    private String frequency;
    @Column(name = "pricingtable")
    private String pricingTable;

    public Plan() { }

    //setters and getters omitted
}
  

Вот конфигурация ModelMapper.

 @Bean
public ModelMapper modelMapper() {
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setAmbiguityIgnored(true);

    PropertyMap<PlanDTO, Plan> itemMap1 = new PropertyMap<PlanDTO, Plan>() {
        protected void configure() {
            map().setFormula(source.getFormula());
            map().setFrequency(source.getFrequency());
            map().setId(new Plan(source.getId(), source.getName()));
            map().setPricingTable(source.getPricingtable());
        }
    };
    modelMapper.addMappings(itemMap1);
}
  

Но это происходит во время выполнения debug image

Что-то не так с конфигурацией? Я что-то пропустил?

Ответ №1:

Я не совсем уверен, в чем ваша проблема, но сопоставление должно быть довольно простым с помощью только одного сопоставления свойств:

 modelMapper.addMappings(new PropertyMap<PlanDTO, Plan>() {
    @Override
    protected void configure() {
        map().getId().setName(source.getName());
    }            
});
  

Все остальные поля должны быть неявно сопоставлены по их имени. Даже PlanId.id .