配置模型映射器在从集合<Author>转换为集合<Integer>时给我一个错误



我正在尝试将book类(livro)转换为bookDto。我试着创建一个模型映射器的bean配置,但它不起作用。我在book类上有一个作者集(autores)和一个类型集(generos),所有类都有整数id。我希望BookDTO只有一组id。我想问题是在模型映射器配置上,我做了

package br.com.newgo.biblioteca.config;
import br.com.newgo.biblioteca.data.dto.output.LivroCriadoDto;
import br.com.newgo.biblioteca.data.entity.Autor;
import br.com.newgo.biblioteca.data.entity.Genero;
import br.com.newgo.biblioteca.data.entity.Livro;
import org.modelmapper.Converter;
import org.modelmapper.ModelMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Set;
import java.util.stream.Collectors;
@Configuration
public class MapperConfig {
@Bean
public ModelMapper modelMapper(){
ModelMapper modelMapper = new ModelMapper();
Converter<Set<Autor>, Set<Integer>> autoresParaAutoresId = context -> {
if (context.getSource() == null) {
return null;
}
return context.getSource().stream()
.map(Autor::getId).collect(Collectors.toSet());
};
Converter<Set<Genero>, Set<Integer>> generosParaGenerosId = context -> {
if (context.getSource() == null){
return null;
}
return context.getSource().stream()
.map(Genero::getId).collect(Collectors.toSet());
};
modelMapper.typeMap(Livro.class , LivroCriadoDto.class).addMappings(
src -> {
src.using(autoresParaAutoresId).map(Livro::getAutores, LivroCriadoDto::setAutores);
src.using(generosParaGenerosId).map(Livro::getGeneros, LivroCriadoDto::setGeneros);
});
return modelMapper;
}
}

这是我的书类:

package br.com.newgo.biblioteca.data.entity;

import jakarta.persistence.*;
import lombok.*;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity()
@Table(name = "livros")
public class Livro {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(nullable = false)
private String nome;
@Column(nullable = false, length = 13)
private String isbn;
//de 10 ou 13?
@Column(nullable = false)
private Float valor;
@Column(nullable = false)
private Integer paginas;
@Column(nullable = false)
private Float altura;
@Column(nullable = false)
private Float largura;
@Column(nullable = false)
private Float profundidade;
@ManyToMany
@JoinTable(name = "livro_genero")
private Set<Genero> generos = new HashSet<>();
@ManyToMany
@JoinTable(name = "livro_autor",
joinColumns = @JoinColumn(name = "livro_id"),
inverseJoinColumns = @JoinColumn(name = "autor_id"))
private Set<Autor> autores = new HashSet<>();

}

,这里是我想转换成的dto:

package br.com.newgo.biblioteca.data.dto.output;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class LivroCriadoDto {
@NotNull
private Integer id;
@NotBlank
private String nome;
@NotBlank
@Length(min = 10, max = 13)
private String isbn;
@NotNull
@Positive
private Float valor;
@NotNull
@Positive
private Integer paginas;
@NotNull
@Positive
private Float altura;
@NotNull
@Positive
private Float largura;
@NotNull
@Positive
private Float profundidade;
@NotNull
@NotEmpty
private Set<Integer> generos = new HashSet<>();
@NotNull
@NotEmpty
private Set<Integer> autores = new HashSet<>();
}

我正在尝试做这个

modelMapper.map(livro, LivroCriadoDto.class);

然后返回我

Converter br.com.newgo.biblioteca.config.MapperConfig$$Lambda$1243/0x000000080140e3d8@16a95f37 failed to convert org.hibernate.collection.spi.PersistentSet to java.util.Set.

1) Converter br.com.newgo.biblioteca.config.MapperConfig$$Lambda$1243/0x000000080140e3d8@16a95f37 failed to convert org.hibernate.collection.spi.PersistentSet to java.util.Set.
Caused by: java.lang.NullPointerException
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at br.com.newgo.biblioteca.config.MapperConfig.lambda$modelMapper$0(MapperConfig.java:27)
at org.modelmapper.internal.MappingEngineImpl.convert(MappingEngineImpl.java:306)
at org.modelmapper.internal.MappingEngineImpl.setDestinationValue(MappingEngineImpl.java:243)
at org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:187)
at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:151)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:105)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:71)
at org.modelmapper.ModelMapper.mapInternal(ModelMapper.java:589)
at org.modelmapper.ModelMapper.map(ModelMapper.java:422)
at br.com.newgo.biblioteca.domain.services.LivroService.cadastrar(LivroService.java:51)
at br.com.newgo.biblioteca.presentation.controllers.LivroController.cadastrar(LivroController.java:21)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1010)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:913)

问题是jpa正在创建一个Autor和Genero空,因为它不应该是空的,并且传递它没有Livro

相关内容