【发布时间】:2020-12-10 06:06:28
【问题描述】:
我有父(产品)和子(书、家具),并且想将产品实体映射到产品 DTO。如您所见,产品被映射并存储在数据库的单个表中。如何映射具有子级额外详细信息的父级产品?
我查看了 this、this 和 this 以了解一些想法,但没有运气
实体
@Entity
@Table(name = "product")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Product {
@Id
private long id;
private String productName;
}
@Entity
@DiscriminatorValue("Book")
public class Book extends Product {
private String author;
...
}
@Entity
@DiscriminatorValue("Furniture")
public class Furniture extends Product {
String color;
...
}
DTO
public class ProductDto {
private long id;
private String productName;
...
}
public class BookDto extends ProductDto {
private String author;
...
}
public class FurnitureDto extends ProductDto {
String color;
...
}
映射器
@Mapper(uses = {BookMapper.class,FurnitureMapper.class})
public interface ProductMapper {
ProductDto productToProductDto(Product product);
Product productDtoToProduct(ProductDto productDto);
}
@Mapper
public interface BookMapper {
BookDto bookToBookDto(Book book);
Book bookDtoToBook(BookDto bookDto);
}
@Mapper
public interface FurnitureMapper {
FurnitureDto furnitureToFurnitureDto(Furniture furniture);
Furniture furnitureDtoToFurniture(FurnitureDto furnitureDto);
}
服务
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
ProductRepository productRepository;
@Autowired
ProductMapper productMapper;
@Override
public List<ProductDto> getAllProducts() {
List<ProductDto> listOfProducts = new ArrayList<>();
productRepository.findAll().forEach(i ->
listOfProducts.add(productMapper.productToProductDto(i)));
return listOfProducts;
}
}
已编辑
将产品实体映射到产品 dto 后,我得到以下结果。它不绑定数据,也不包括其子属性。上面的 mapper 部分是否正确?
[
{
"id": 0,
"productName": null
},
{
"id": 0,
"productName": null
},
...
]
然而结果应该如下所示:
[
{
"id": 11,
"productName": ABC,
"author":"James"
},
{
"id": 22,
"productName": XYZ,
"color":"Oak"
},
...
]
【问题讨论】:
-
您面临的具体问题是什么?
-
@NikolaiShevchenko 我已经用我得到的错误更新了问题
-
因为错误消息指出问题不在于 MapStruct,而在于 Jackson
-
@NikolaiShevchenko 之前的错误是注释。我已经更新了这个问题。似乎数据未正确绑定,因为映射后我得到空数据。你能检查一下我为父类和子类编写映射器的映射器部分吗?
-
检查this。可能有用!
标签: java spring-boot mapstruct