当前位置: 首页 > 知识库问答 >
问题:

ModelMapper和DozerBeanMapper不工作|Spring Boot REST API

羊舌志
2023-03-14

我正在开发Spring Boot Rest Api。我有一门课叫"Wypozyczenie",还有一门课叫"WypozyczenieDTO"。我想从类Wypozyczenie(避免嵌套对象)中提取一些信息,并根据WypozyczenieDTO的信息返回数据。我试过DozerBeanMapper和ModelMapper,两者都没有正确转换我的对象。所有的值都是空或零!我正在调试,在应该做我的转换的行不工作。以下是发生转换的函数:

private WypozyczenieDto convertToDto(Wypozyczenie wypozyczenie) {
        WypozyczenieDto wypozyczenieDto = mDozerBeanMapper.map(wypozyczenie, WypozyczenieDto.class);
        return wypozyczenieDto;
    }

我正在调试,Wypozyczenedto中的所有参数都是null或零。

以下是Wypozyczenie和WypozyczenieDto类(不含getter和setter):

public class WypozyczenieDto {

    private Long id;

    @JsonProperty("planowana_data_rozpoczecia")
    private LocalDateTime planowanaDataRozpoczecia;

    @JsonProperty("planowana_data_zakonczenia")
    private LocalDateTime planowanaDataZakonczenia;

    @JsonProperty("faktyczna_data_rozpoczecia")
    private LocalDateTime faktycznaDataRozpoczecia;

    @JsonProperty("faktyczna_data_zakonczenia")
    private LocalDateTime faktycznaDataZakonczenia;

    @JsonProperty("przebieg_rozpoczecia")
    private int przebiegRozpoczecia;

    @JsonProperty("przebieg_zakonczenia")
    private int przebiegZakonczenia;

    @JsonProperty("id_pracownika")
    private Long idPracownika;

    @JsonProperty("id_pojazdu")
    private Long idPojazdu;

    @JsonProperty("status_wypozyczenia")
    private Wypozyczenie.statusyWypozyczenia statusWypozyczenia;

这是Wypozyczenie类:

@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Wypozyczenie {

    //ENUM Type of statusyWypozyczenia
    public enum statusyWypozyczenia{
        ZAREZERWOWANE, WYPOZYCZONE, ZAKONCZONE;
        public static final EnumSet<statusyWypozyczenia> allStatusyWypozyczenia = EnumSet.allOf(statusyWypozyczenia.class);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(columnDefinition = "datetime2")
    @JsonProperty("planowana_data_rozpoczecia")
    private LocalDateTime planowanaDataRozpoczecia;
    @Column(columnDefinition = "datetime2")
    @JsonProperty("planowana_data_zakonczenia")
    private LocalDateTime planowanaDataZakonczenia;
    @Column(columnDefinition = "datetime2")
    @JsonProperty("faktyczna_data_rozpoczecia")
    private LocalDateTime faktycznaDataRozpoczecia;
    @Column(columnDefinition = "datetime2")
    @JsonProperty("faktyczna_data_zakonczenia")
    private LocalDateTime faktycznaDataZakonczenia;

    @JsonProperty("przebieg_rozpoczecia")
    private int przebiegRozpoczecia;

    @JsonProperty("przebieg_zakonczenia")
    private int przebiegZakonczenia;

    @ManyToOne(fetch=FetchType.LAZY)
    @JsonManagedReference
    private Pracownik pracownik;

    @ManyToOne(fetch=FetchType.LAZY)
    @JsonManagedReference
    private Pojazd pojazd;



    @Enumerated
    @Column(columnDefinition = "smallint")
    @JsonProperty("status_wypozyczenia")
    private statusyWypozyczenia statusWypozyczenia;

    @OneToMany(mappedBy = "wypozyczenie")
    @JsonBackReference
    private List<CzynnoscSerwisowa> czynnosciSerwisowe;

    @OneToMany(mappedBy = "wypozyczenie")
    @JsonBackReference
    private List<CzynnoscEksploatacyjna> czynnosciEksploatacyjne;

这是主应用程序的主应用程序,您可以看到我如何初始化bean:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class ApiBdCarRentApplication {


    @Bean
    public DozerBeanMapper mDozerBeanMapper() {
        return new DozerBeanMapper();
    }

    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }

    public static void main(String[] args) {

        System.out.println(Integer.getInteger("4"));
        SpringApplication.run(ApiBdCarRentApplication.class, args);

    }


}

这是Wypozyczenia类的控制器:

@RequestMapping("/wypozyczenia")
@RestController
public class WypozyczenieController {

    private WypozyczenieService mWypozyczenieService;
    private DozerBeanMapper mDozerBeanMapper;



    @Autowired
    public WypozyczenieController(WypozyczenieService wypozyczenieService, DozerBeanMapper dozerBeanMapper) {
        mWypozyczenieService = wypozyczenieService;
        mDozerBeanMapper = dozerBeanMapper;

    }

    @GetMapping("")
    public List<WypozyczenieDto> getAllWypozyczenia(){
        List<Wypozyczenie> wypozyczenia = mWypozyczenieService.getAllWypozyczenia();
        return wypozyczenia.stream()
                .map(wypozyczenie -> convertToDto(wypozyczenie))
                .collect(Collectors.toList());
    }

    private WypozyczenieDto convertToDto(Wypozyczenie wypozyczenie) {
        WypozyczenieDto wypozyczenieDto = mDozerBeanMapper.map(wypozyczenie, WypozyczenieDto.class);
        return wypozyczenieDto;
    }

请帮帮我。到底是怎么回事?为什么它甚至不能在简单的转换级别上工作(我已经在其他类上尝试过了)。

共有1个答案

西门梓
2023-03-14

我只是试着用BeanUtils的方法做了下面的事情。Spring框架的copyProperties。看起来很好用。无法使用LocalDateTime进行测试,因为我没有Java 8。尝试使用日期

public class BeanCopyTest{
    private static WypozyczenieDto convertToDto(Wypozyczenie wypozyczenie) {
       WypozyczenieDto wypozyczenieDto = new WypozyczenieDto(); 
       BeanUtils.copyProperties(wypozyczenie,wypozyczenieDto);
       return wypozyczenieDto;
    }

    public static void main(String[] args){
       Wypozyczenie wypozyczenie = new Wypozyczenie();
       wypozyczenie.setId((long)1);
       wypozyczenie.setPrzebiegRozpoczecia(2);
       wypozyczenie.setPrzebiegZakonczenia(3);
       wypozyczenie.setPlanowanaDataRozpoczecia(new Date());
       WypozyczenieDto wypozyczenieDto = convertToDto(wypozyczenie);
       System.out.println("Id = "+wypozyczenieDto.getId());
       System.out.println("Rozpoczecia = "+wypozyczenieDto.getPrzebiegRozpoczecia());
       System.out.println("Zakonczenia = "+wypozyczenieDto.getPrzebiegZakonczenia());
       System.out.println("PlanowanaDataRozpoczecia = "+wypozyczenieDto.getgetPlanowanaDataRozpoczecia());
    }
}

打印以下结果。

Id = 1
Rozpoczecia = 2
Zakonczenia = 3
PlanowanaDataRozpoczecia = Fri Feb 02 11:09:48 IST 2018
 类似资料:
  • 我在Spring服务中使用推土机。如何使用JUnit和Mockito将注入到已测试的服务中? 我的java类(如果简化)看起来像: 使用JUnit 4 Mockito Hamcrest的测试类如下所示: 问题在于模拟的Dozer实例没有按预期映射对象——默认情况下,Mockito存根返回空或空对象。如果我从测试中删除注释,它会抛出NPE!

  • 伙计们,你们能帮帮忙吗 所以我正在尝试显示我从后端获得的数据,但似乎 *ngFor 不起作用,只想返回启用的大小如何使用 ngIf 这是模板 这是我得到的数据(我正在循环的部分) 所以我需要显示每个尺寸的价格,然后减去折扣,如果未启用,则显示隐藏该尺寸。

  • 我正在使用Tomcat8作为Spring Boot项目的一部分,我的acceptCount设置似乎不起作用。我的服务器不是只接受300个连接,而是接受了我扔给它的近1000个连接,当然同时处理的连接不超过200个。 Tomcat文档在AcceptCount上似乎很清楚:“当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当队列满时接收的任何请求都将被拒绝。”但显然这不会发生。 当然还

  • 我正在做一个窗口,有一个大的文本区域和一个小的文本区域下。这是我到目前为止得到的: 这是我的代码: 我如何使较大的textarea部分透明,这样我就可以看到背景,我如何移动“比如说:”到较小的textarea前面?

  • ModelMapper,Java Object Mapping 工具,类似BeanUtils,效率略低于Orika,但是内部策略丰富,配置方式更舒适。

  • 目前,我正在尝试将dto映射到一个也包含LocalDate属性的类。只是我在这里没有成功,本地日期字段始终保持为空。因此,我构建了一个简短的示例,其中我遵循Modelmapper提供的非常有用的提示,将字符串转换为LocalDate,因此我有一个Modelmapper类,如下所示: 此外,为了可读性,我有一个POJO,它只有两个字段,一个id和一个本地日期(不带getter和setter)。 我创