Spring MVC + MySQL に基づいて、Web にある種の「ポーリング システム」を実装しようとしています。私が抱えている問題は、マップしようとしている 2 つのクラスがあることです。1 つは Web 経由でデータを移動するために使用する DTO で、もう 1 つは Hibernate でデータベースにアクセスするために使用するものです。ここまでは順調ですね。
私が実装しようとしているアイデアは、DTO にいくつかのリストを作成し、それらを JSON に変換し、その後データベースに (文字列として) 保存することです。
これら 2 つのオブジェクトをマッピングするために、Orika カスタム マップを使用しています。私に起こった面白いことは、私が持っているリストを JSON としてデータベースに保存できることです (私は GSON を使用してそれらを変換しています)。
誰かが私を助けてくれるかどうかを確認するために、コードをできるだけ明確にしようと思います。私が言っているように、データを保存するときはまったく問題ありませんが、データを取得する必要がある場合 (文字列を取得し、JSON に解析し、その後リストに解析する)、データが折りたたまれます。 . 何か案は??前もって感謝します
オリカマッピング
mapperFactory.classMap(EncuestaDTO.class, Encuesta.class).mapNulls(false).byDefault().customize(new CustomMapper<EncuestaDTO, Encuesta>(){
@Override
public void mapAtoB(EncuestaDTO a, Encuesta b, MappingContext context){
Type listTypeString = new TypeToken<List<String>>(){}.getType();
/************ Respuestas */
String respuestas = new Gson().toJson(a.getRespuestas(), listTypeString);
b.setRespuestas(respuestas);
}
@Override
@SuppressWarnings("unchecked")
public void mapBtoA(Encuesta b, EncuestaDTO a, MappingContext context){
Type listTypeString = new TypeToken<List<String>>(){}.getType();
/************ Respuestas */
List<String> respuestas = new Gson().fromJson(b.getRespuestas(), listTypeString);
a.setRespuestas(respuestas);
}
}).register();
エンクエスタ
@Id
@Column(name = "idEncuesta", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idEncuesta;
@Column(name = "idCreador", nullable = false)
private Long idCreador;
@Column(name = "pregunta")
private String pregunta;
@Column(name = "respuestas")
private String respuestas;
@Column(name = "numRespuestas")
private Long numRespuestas;
@Column(name = "fechaCreacion")
private Date fechaCreacion;
@Column(name = "fechaFin")
private Date fechaFin;
@Column(name = "oficial")
private boolean oficial;
エンクエスタDTO
private Long idEncuesta;
private Long idCreador;
private String pregunta;
private List<String> respuestas;
private Long numRespuestas;
private Date fechaCreacion;
private Date fechaFin;
private boolean oficial;
マネジャー
@Override
public void aniadirEncuesta(EncuestaDTO encuestaDTO) {
encuestaRepositorio.aniadirEncuesta(mapper.map(encuestaDTO, Encuesta.class));
}
@Override
public List<EncuestaDTO> getListaEncuestas() {
List<Encuesta> listaEncuesta = (List<Encuesta>) encuestaRepositorio.getListaEncuestas();
return mapper.mapAsList(listaEncuesta, EncuestaDTO.class); // HERE I GET THE ERROR
}
例外
GRAVE: El Servlet.service() para el servlet [appServlet] en el contexto con ruta [/myApp] lanzó la excepción [Request processing failed; nested exception is ma.glasnost.orika.MappingException: While attempting the folling mapping:
sourceType = String
destinationType = ArrayList<String>
Error occurred: ma.glasnost.orika.MappingException: While attempting the folling mapping:
sourceType = ArrayList<String>
sourceProperty = 1(String)
destinationType = String
destinationProperty = bytes(byte[])
Error occurred: java.lang.IllegalArgumentException: Attempt was made to generate assignment/setter code for [destination.bytes(byte[])] which has no setter/assignment method] con causa raíz
java.lang.IllegalArgumentException: Attempt was made to generate assignment/setter code for [destination.bytes(byte[])] which has no setter/assignment method
at ma.glasnost.orika.impl.generator.VariableRef.assign(VariableRef.java:223)
at ma.glasnost.orika.impl.generator.specification.ObjectToObject.generateMappingCode(ObjectToObject.java:23)
at ma.glasnost.orika.impl.generator.SourceCodeContext.mapFields(SourceCodeContext.java:644)
at ma.glasnost.orika.impl.generator.MapperGenerator.generateFieldMapCode(MapperGenerator.java:252)
at ma.glasnost.orika.impl.generator.MapperGenerator.addMapMethod(MapperGenerator.java:172)
at ma.glasnost.orika.impl.generator.MapperGenerator.build(MapperGenerator.java:72)
at ma.glasnost.orika.impl.DefaultMapperFactory.buildMapper(DefaultMapperFactory.java:1046)
at ma.glasnost.orika.impl.DefaultMapperFactory.lookupMapper(DefaultMapperFactory.java:614)
at ma.glasnost.orika.impl.DefaultMapperFactory.lookupMapper(DefaultMapperFactory.java:581)
at ma.glasnost.orika.impl.MapperFacadeImpl.resolveMapper(MapperFacadeImpl.java:523)
at ma.glasnost.orika.impl.MapperFacadeImpl.resolveMappingStrategy(MapperFacadeImpl.java:203)
at ma.glasnost.orika.impl.DefaultBoundMapperFacade$BoundStrategyCache.getStrategy(DefaultBoundMapperFacade.java:253)
at ma.glasnost.orika.impl.DefaultBoundMapperFacade.map(DefaultBoundMapperFacade.java:136)
at ma.glasnost.orika.generated.Orika_Encuesta_EncuestaDTO_Mapper137715823.mapBtoA(Orika_Encuesta_EncuestaDTO_Mapper137715823.java)
at ma.glasnost.orika.impl.ReversedMapper.mapAtoB(ReversedMapper.java:65)
at ma.glasnost.orika.impl.mapping.strategy.UseCustomMapperStrategy$ForwardMapperReference.map(UseCustomMapperStrategy.java:74)
at ma.glasnost.orika.impl.mapping.strategy.UseCustomMapperStrategy.map(UseCustomMapperStrategy.java:50)
at ma.glasnost.orika.impl.MapperFacadeImpl.mapAsCollection(MapperFacadeImpl.java:633)
at ma.glasnost.orika.impl.MapperFacadeImpl.mapAsList(MapperFacadeImpl.java:386)
at ma.glasnost.orika.impl.MapperFacadeImpl.mapAsList(MapperFacadeImpl.java:716)
at ma.glasnost.orika.impl.ConfigurableMapper.mapAsList(ConfigurableMapper.java:180)
MySQL テーブル
CREATE TABLE `encuestas` (
`idEncuesta` int(11) NOT NULL AUTO_INCREMENT,
`idCreador` int(11) NOT NULL,
`pregunta` longtext,
`respuestas` longtext,
`numRespuestas` int(11) DEFAULT NULL,
`fechaCreacion` datetime DEFAULT NULL,
`fechaFin` datetime DEFAULT NULL,
`oficial` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`idEncuesta`),
UNIQUE KEY `idEncuesta_UNIQUE` (`idEncuesta`),
KEY `idCreador_idx` (`idCreador`),
CONSTRAINT `idCreador` FOREIGN KEY (`idCreador`) REFERENCES `usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;