【问题标题】:ModelMapper returns NULL when trying to map Entity to DTO object尝试将实体映射到 DTO 对象时,ModelMapper 返回 NULL
【发布时间】:2018-05-13 18:49:55
【问题描述】:

这是我要映射的对象的类:

package com.agent.module.entities;


import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

@Entity
@Getter @Setter @NoArgsConstructor
@Accessors
public class Accommodation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String location;
    @ManyToOne(optional=false, fetch=FetchType.EAGER)
    private AccommodationType type;

    private String description;

    private String name;
    @OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    private Set<Document> images;

    private Integer capacity;
    @ManyToMany(fetch=FetchType.EAGER)
    private Set<AdditionalService> additionalServices;

    @OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    private Set<PricePlan> pricePlan;

    @ManyToOne(optional=false, fetch=FetchType.LAZY)
    private Agent agent;

    @OneToMany(orphanRemoval=true, mappedBy="accommodation", fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    private Set<Restriction> restrictions;

    @ManyToOne(fetch=FetchType.EAGER)
    private Category category;

    @Override
    public String toString() {
        return "Name: "+name+"\n"+"Agent PIB: "+agent.toString()+"\n";
    }

}

这是我的 DTO 对象:

package com.agent.module.dto;

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter @Setter @NoArgsConstructor
@XmlRootElement
public class AccommodationView {
    private Long id;
    private String location;
    private String typeName;
    private String description;
    private String name;
    private List<String> imagesPath;
    private Integer capacity;
    private List<String> additionalServicesName;
    private List<PricePlanView> pricePlan;
    private String agentUsername;
    private List<RestrictionView> restrictions;
    private String categoryName;

    @Override
    public String toString() {
        return "ID: "+id+"\n"+"Type: "+typeName+"\n"+"Description: "+description+"\n"+"Category: "+categoryName+"\n"+"Name: "+name+"\n";
    }

}

当我打开我的 Postman 并尝试从 MySQL 数据库中获取所有 Accommodation 对象时,我实际上想要获取 DTO 对象,为此我使用了 ModelMapper。但是由于某种原因,每次我尝试将Accommodation 映射到AccommodationView 时,我都会得到 Null 作为回报。这是我尝试执行映射的类:

@RestController
@RequestMapping(value = "/accommodation")
public class AccommodationController {

    @Autowired
    AccommodationRepo accommodationRepo;

    @Autowired 
    ModelMapper mapper;

    @RequestMapping(value="/all",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    ResponseEntity<List<AccommodationView>> getAll(){
        List<Accommodation> accommodations = accommodationRepo.findAll();

        List<AccommodationView> accommodationViewList= new ArrayList<AccommodationView>();

        for(Accommodation accommodation : accommodations) {
            System.out.println(accommodation);
            System.out.println(convertToDto(accommodation));
            accommodationViewList.add(convertToDto(accommodation));
        }

        return new ResponseEntity<List<AccommodationView>>(accommodationViewList, HttpStatus.OK);
    }

    private AccommodationView convertToDto(Accommodation accommodation) {
        return mapper.map(accommodation, AccommodationView.class);
    }

    private Accommodation convertToEntity(AccommodationView accommodationView) {
        return mapper.map(accommodationView, Accommodation.class);
    }
}

这是我点击该方法时得到的输出:

Name: Test
Agent PIB: 2308995710368

ID: null
Type: null
Description: null
Category: null
Name: null

输出的第一部分来自Accommodation对象,输出的第二部分来自AccommodationView对象。如果有人知道发生了什么,我将非常感谢您的帮助。

【问题讨论】:

  • 我之前没用过ModelMapper,但我觉得你需要检查匹配策略:link

标签: java spring-boot dto modelmapper


【解决方案1】:

您必须为目标类生成公共设置器函数,在您的情况下(住宿实体)。否则 Modelmapper 无法访问您的类的私有字段来设置它们的值。

【讨论】:

  • 它使用的是lombok @Getter @Setter,基本上生成setter/getter。 lombok 和模型映射器是否存在已知问题?
  • @lemoncodes 是的,当您忘记将这些应用到您的班级时
  • 我遇到了同样的问题,想知道为什么我得到空值 - 似乎是因为我删除了未使用的 getter/setter,认为 @Builder 就足够了。添加了 getter/setter Lombok 注释,这解决了我的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2018-09-13
  • 1970-01-01
相关资源
最近更新 更多