Java 用于列出转换问题的MapStruct页
我不熟悉Spring和MapStruct。我在从页面转换到列表时遇到问题。我在服务中使用了MapStruct映射器。我需要从DB获取所有产品,然后使用MapStruct mapper转换为Java 用于列出转换问题的MapStruct页,java,spring-boot,dto,mapstruct,Java,Spring Boot,Dto,Mapstruct,我不熟悉Spring和MapStruct。我在从页面转换到列表时遇到问题。我在服务中使用了MapStruct映射器。我需要从DB获取所有产品,然后使用MapStruct mapper转换为ProductResponse,然后返回PagedResponse对象,但出现以下错误: java.lang.ClassCastException: org.springframework.data.domain.PageImpl cannot be cast to java.util.List at
ProductResponse
,然后返回PagedResponse
对象,但出现以下错误:
java.lang.ClassCastException: org.springframework.data.domain.PageImpl cannot be cast to java.util.List
at org.walana.GP.service.ProductService.getAll(ProductService.java:67) ~[classes/:na]
at org.walana.GP.controller.ProductController.getAll(ProductController.java:40)
ReplaceNumber
@Entity
@Table(name = "replace_numbers")
public class ReplaceNumber extends UserDateAudit
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 20)
private String partNumber;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id", nullable = false)
private Product product;
public ReplaceNumber() {}
public ReplaceNumber(String partNumber)
{
this.partNumber = partNumber;
}
}
@Mapper(componentModel = "spring")
public interface ProductMapper
{
ProductResponse toProductResponse(Product product);
List<ProductResponse> toProductResponses(List<Product> products);
Product toProduct(ProductResponse productResponse);
}
@RestController
@RequestMapping("/api/products")
public class ProductController
{
@Autowired
private ProductService productService;
private static final Logger logger = LoggerFactory.getLogger(ProductController.class);
@GetMapping
public PagedResponse<ProductResponse> getAll(@CurrentUser UserPrincipal currentUser,
@RequestParam(value = "page", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) int page,
@RequestParam(value = "size", defaultValue = AppConstants.DEFAULT_PAGE_SIZE) int size)
{
return productService.getAll(currentUser, page, size);
}
}
ReplaceNumberResponse
public class ReplaceNumberResponse
{
private Long id;
private String partNumber;
}
public class ProductResponse
{
private Long id;
private String partNumber;
private String description;
private List<ReplaceNumberResponse> replaceNumberResponses;
private ProductManufacturerResponse manufacturer;
private ProductModelResponse model;
private ProductCategoryResponse category;
private float cost;
private float price;
}
public class PagedResponse<T>
{
private List<T> content;
private int page;
private int size;
private long totalElements;
private int totalPages;
private boolean last;
public PagedResponse() {
}
public PagedResponse(List<T> content, int page, int size, long totalElements, int totalPages, boolean last) {
this.content = content;
this.page = page;
this.size = size;
this.totalElements = totalElements;
this.totalPages = totalPages;
this.last = last;
}
}
@Service
public class ProductService
{
@Autowired
ProductRepository productRepository;
@Autowired
ProductMapper productMapper;
public PagedResponse<ProductResponse> getAll(UserPrincipal currentUser, int page, int size)
{
Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt");
Page<Product> products = productRepository.findAll(pageable);
if (products.getNumberOfElements() == 0)
{
return new PagedResponse<>(Collections.emptyList(), products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
List<ProductResponse> productResponses = productMapper.toProductResponses((List<Product>) products);
return new PagedResponse<>(productResponses, products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
}
产品
@Entity
@Table(name = "products", indexes = {@Index(name= "part_number_index", columnList = "part_number", unique = true)})
public class Product extends UserDateAudit
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Column(name = "part_number", nullable = false)
@Size(max = 20)
private String partNumber;
@NotBlank
@Size(max = 255)
private String description;
@OneToMany(
mappedBy = "product",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
@Fetch(FetchMode.SELECT)
private List<ReplaceNumber> replaceNumbers = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "product_manufacturer_id", referencedColumnName = "id")
private ProductManufacturer manufacturer;
@ManyToOne
@JoinColumn(name = "product_model_id", referencedColumnName = "id")
private ProductModel model;
@ManyToOne
@JoinColumn(name = "product_category_id", referencedColumnName = "id")
private ProductCategory category;
@Column(name = "cost", nullable = false)
@DecimalMin(message = "Cost should be greater than 1", value = "1")
private float cost;
@Column(name = "price", nullable = false)
@DecimalMin(message = "Price should be greater than 0", value = "0")
private float price;
}
@实体
@表(name=“products”,Index={@Index(name=“part\u number\u Index”,columnList=“part\u number”,unique=true)})
公共类产品扩展了UserDateAudit
{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@不空白
@列(name=“part\u number”,null=false)
@尺寸(最大值=20)
私有字符串部件号;
@不空白
@尺寸(最大值=255)
私有字符串描述;
@独身癖(
mappedBy=“产品”,
cascade=CascadeType.ALL,
fetch=FetchType.EAGER,
孤立删除=真
)
@Fetch(FetchMode.SELECT)
private List replaceNumber=new ArrayList();
@许多酮
@JoinColumn(name=“产品\制造商\标识”,referencedColumnName=“标识”)
私人产品制造商;
@许多酮
@JoinColumn(name=“product\u model\u id”,referencedColumnName=“id”)
私人产品模型;
@许多酮
@JoinColumn(name=“product\u category\u id”,referencedColumnName=“id”)
私人产品类别;
@列(name=“cost”,nullable=false)
@小数点(message=“成本应大于1”,value=“1”)
私人浮动成本;
@列(name=“price”,nullable=false)
@小数点(message=“价格应大于0”,value=“0”)
私人浮动价格;
}
ProductResponse
public class ReplaceNumberResponse
{
private Long id;
private String partNumber;
}
public class ProductResponse
{
private Long id;
private String partNumber;
private String description;
private List<ReplaceNumberResponse> replaceNumberResponses;
private ProductManufacturerResponse manufacturer;
private ProductModelResponse model;
private ProductCategoryResponse category;
private float cost;
private float price;
}
public class PagedResponse<T>
{
private List<T> content;
private int page;
private int size;
private long totalElements;
private int totalPages;
private boolean last;
public PagedResponse() {
}
public PagedResponse(List<T> content, int page, int size, long totalElements, int totalPages, boolean last) {
this.content = content;
this.page = page;
this.size = size;
this.totalElements = totalElements;
this.totalPages = totalPages;
this.last = last;
}
}
@Service
public class ProductService
{
@Autowired
ProductRepository productRepository;
@Autowired
ProductMapper productMapper;
public PagedResponse<ProductResponse> getAll(UserPrincipal currentUser, int page, int size)
{
Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt");
Page<Product> products = productRepository.findAll(pageable);
if (products.getNumberOfElements() == 0)
{
return new PagedResponse<>(Collections.emptyList(), products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
List<ProductResponse> productResponses = productMapper.toProductResponses((List<Product>) products);
return new PagedResponse<>(productResponses, products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
}
公共类ProductResponse
{
私人长id;
私有字符串部件号;
私有字符串描述;
私有列表替换编号响应;
私人产品制造商或响应制造商;
私有产品模型响应模型;
私人产品类别响应类别;
私人浮动成本;
私人浮动价格;
}
ProductMapper
@Entity
@Table(name = "replace_numbers")
public class ReplaceNumber extends UserDateAudit
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 20)
private String partNumber;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id", nullable = false)
private Product product;
public ReplaceNumber() {}
public ReplaceNumber(String partNumber)
{
this.partNumber = partNumber;
}
}
@Mapper(componentModel = "spring")
public interface ProductMapper
{
ProductResponse toProductResponse(Product product);
List<ProductResponse> toProductResponses(List<Product> products);
Product toProduct(ProductResponse productResponse);
}
@RestController
@RequestMapping("/api/products")
public class ProductController
{
@Autowired
private ProductService productService;
private static final Logger logger = LoggerFactory.getLogger(ProductController.class);
@GetMapping
public PagedResponse<ProductResponse> getAll(@CurrentUser UserPrincipal currentUser,
@RequestParam(value = "page", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) int page,
@RequestParam(value = "size", defaultValue = AppConstants.DEFAULT_PAGE_SIZE) int size)
{
return productService.getAll(currentUser, page, size);
}
}
@Mapper(componentModel=“spring”)
公共接口ProductMapper
{
ProductResponse到ProductResponse(产品);
列出TopProductResponses(列出产品);
产品到产品(ProductResponse ProductResponse);
}
页面响应
public class ReplaceNumberResponse
{
private Long id;
private String partNumber;
}
public class ProductResponse
{
private Long id;
private String partNumber;
private String description;
private List<ReplaceNumberResponse> replaceNumberResponses;
private ProductManufacturerResponse manufacturer;
private ProductModelResponse model;
private ProductCategoryResponse category;
private float cost;
private float price;
}
public class PagedResponse<T>
{
private List<T> content;
private int page;
private int size;
private long totalElements;
private int totalPages;
private boolean last;
public PagedResponse() {
}
public PagedResponse(List<T> content, int page, int size, long totalElements, int totalPages, boolean last) {
this.content = content;
this.page = page;
this.size = size;
this.totalElements = totalElements;
this.totalPages = totalPages;
this.last = last;
}
}
@Service
public class ProductService
{
@Autowired
ProductRepository productRepository;
@Autowired
ProductMapper productMapper;
public PagedResponse<ProductResponse> getAll(UserPrincipal currentUser, int page, int size)
{
Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt");
Page<Product> products = productRepository.findAll(pageable);
if (products.getNumberOfElements() == 0)
{
return new PagedResponse<>(Collections.emptyList(), products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
List<ProductResponse> productResponses = productMapper.toProductResponses((List<Product>) products);
return new PagedResponse<>(productResponses, products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
}
公共类页面响应
{
私有列表内容;
私人网页;
私有整数大小;
私有长元素;
私人网页;
私有布尔最后;
公共页面响应(){
}
公共页面响应(列表内容、整型页面、整型大小、长型totalElements、整型totalPages、布尔型last){
this.content=内容;
this.page=page;
这个。大小=大小;
this.totalElements=totalElements;
this.totalPages=totalPages;
this.last=last;
}
}
产品服务
public class ReplaceNumberResponse
{
private Long id;
private String partNumber;
}
public class ProductResponse
{
private Long id;
private String partNumber;
private String description;
private List<ReplaceNumberResponse> replaceNumberResponses;
private ProductManufacturerResponse manufacturer;
private ProductModelResponse model;
private ProductCategoryResponse category;
private float cost;
private float price;
}
public class PagedResponse<T>
{
private List<T> content;
private int page;
private int size;
private long totalElements;
private int totalPages;
private boolean last;
public PagedResponse() {
}
public PagedResponse(List<T> content, int page, int size, long totalElements, int totalPages, boolean last) {
this.content = content;
this.page = page;
this.size = size;
this.totalElements = totalElements;
this.totalPages = totalPages;
this.last = last;
}
}
@Service
public class ProductService
{
@Autowired
ProductRepository productRepository;
@Autowired
ProductMapper productMapper;
public PagedResponse<ProductResponse> getAll(UserPrincipal currentUser, int page, int size)
{
Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "createdAt");
Page<Product> products = productRepository.findAll(pageable);
if (products.getNumberOfElements() == 0)
{
return new PagedResponse<>(Collections.emptyList(), products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
List<ProductResponse> productResponses = productMapper.toProductResponses((List<Product>) products);
return new PagedResponse<>(productResponses, products.getNumber(),
products.getSize(), products.getTotalElements(), products.getTotalPages(), products.isLast());
}
}
@服务
公共类产品服务
{
@自动连线
产品库产品库;
@自动连线
ProductMapper ProductMapper;
公共页面响应getAll(UserPrincipal currentUser,int page,int size)
{
Pageable Pageable=PageRequest.of(page,size,Sort.Direction.DESC,“createdAt”);
Page products=productRepository.findAll(可分页);
if(products.getNumberOfElements()==0)
{
返回新的PagedResponse(Collections.emptyList()、products.getNumber(),
products.getSize()、products.getTotalElements()、products.getTotalPage()、products.isLast());
}
List productResponses=productMapper.toProductResponses((列表)产品);
返回新的PagedResponse(productResponses,products.getNumber(),
products.getSize()、products.getTotalElements()、products.getTotalPage()、products.isLast());
}
}
ProductController
@Entity
@Table(name = "replace_numbers")
public class ReplaceNumber extends UserDateAudit
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 20)
private String partNumber;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id", nullable = false)
private Product product;
public ReplaceNumber() {}
public ReplaceNumber(String partNumber)
{
this.partNumber = partNumber;
}
}
@Mapper(componentModel = "spring")
public interface ProductMapper
{
ProductResponse toProductResponse(Product product);
List<ProductResponse> toProductResponses(List<Product> products);
Product toProduct(ProductResponse productResponse);
}
@RestController
@RequestMapping("/api/products")
public class ProductController
{
@Autowired
private ProductService productService;
private static final Logger logger = LoggerFactory.getLogger(ProductController.class);
@GetMapping
public PagedResponse<ProductResponse> getAll(@CurrentUser UserPrincipal currentUser,
@RequestParam(value = "page", defaultValue = AppConstants.DEFAULT_PAGE_NUMBER) int page,
@RequestParam(value = "size", defaultValue = AppConstants.DEFAULT_PAGE_SIZE) int size)
{
return productService.getAll(currentUser, page, size);
}
}
@RestController
@请求映射(“/api/products”)
公共类产品控制器
{
@自动连线
私人产品服务;
私有静态最终记录器Logger=LoggerFactory.getLogger(ProductController.class);
@GetMapping
公共页面响应getAll(@CurrentUser-UserPrincipal-CurrentUser,
@RequestParam(value=“page”,defaultValue=AppConstants.DEFAULT\u page\u NUMBER)int page,
@RequestParam(value=“size”,defaultValue=AppConstants.DEFAULT\u PAGE\u size)int size)
{
return productService.getAll(当前用户、页面、大小);
}
}
更换
productMapper.toProductResponses((List<Product>) products)