首页 > 解决方案 > 从 Dto 转换为实体后 getId 上的 NPE(mapstruct 和 modelmapper)

问题描述

我需要一些帮助:)

我有为每个实体提供 ID、创建时间和更新时间的抽象模型:

@MappedSuperclass
public abstract class AbstractModel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "native")
@Column(name = "ID", updatable = false, nullable = false)
protected Long id;

@Column(updatable = false)
@CreationTimestamp
protected Timestamp creationTime;

@UpdateTimestamp
protected Timestamp updateTime;

//getters and setters

实体样本:

@Entity
@Table(name = "CUSTOMERS", uniqueConstraints={@UniqueConstraint(columnNames = {"fiscalNumber" , "phoneNumber", "email"})})
public class Customer extends AbstractModel {

//other properties
//getters and setters
}

控制器:

public String saveCustomer(@Valid @ModelAttribute("customer") CustomerDto customerDto, BindingResult result, Model model) {

...

    customerService.save(customerMapper.toModel(customerDto));
    model.addAttribute("customer", customerDto);
    return "redirect:/customer/list";
}

道实现:

public Customer save(Customer model) ... {

        if (model.getId() == null) {
            return (Customer) session.merge(model);
        }
...
}

每次我尝试使用 model.getId 获取 Id 时,都会发生 nullPointerException,即使我使用 Objects.isNull(model.getId()),或者将其包装在 Optional 上

如果我尝试相同但要获得creationTime(model.getCreationTime()),它会按预期工作。

额外信息:NPE 仅在将 modelDto(customerDto) 转换为 model(customer) 后出现,并且仅用于 Id。目前我正在使用modelmapper,但我也尝试过使用mapstruct,但我遇到了同样的错误。我也尝试过各种类型的转换策略。

感谢您的关注 :)

标签: javaspring-mvcmapstructconvertersmodelmapper

解决方案


推荐阅读