Orika Mapper和x2B除外;Gson(JSON)和#x2B;MySQL

Orika Mapper和x2B除外;Gson(JSON)和#x2B;MySQL,mysql,json,spring-mvc,gson,orika,Mysql,Json,Spring Mvc,Gson,Orika,我正试图在我的web上基于SpringMVC+MySQL实现某种“投票系统”。我遇到的问题是,我有两个类要映射。一个是用于在web上移动数据的DTO,另一个是用于通过Hibernate访问数据库的DTO。到目前为止,一切顺利 我试图实现的想法是在DTO上有一些列表,将它们转换成JSON,然后将它们保存在数据库中(作为字符串) 现在,为了映射这两个对象,我使用Orika自定义映射。发生在我身上的有趣的事情是,我能够将我拥有的列表以JSON的形式保存到数据库中(我使用GSON转换它们),但是当我需要

我正试图在我的web上基于SpringMVC+MySQL实现某种“投票系统”。我遇到的问题是,我有两个类要映射。一个是用于在web上移动数据的DTO,另一个是用于通过Hibernate访问数据库的DTO。到目前为止,一切顺利

我试图实现的想法是在DTO上有一些列表,将它们转换成JSON,然后将它们保存在数据库中(作为字符串)

现在,为了映射这两个对象,我使用Orika自定义映射。发生在我身上的有趣的事情是,我能够将我拥有的列表以JSON的形式保存到数据库中(我使用GSON转换它们),但是当我需要它们时,Orika抛出和异常

我现在会尽量把我的代码弄清楚,看看是否有人能帮我。正如我告诉你的,当需要保存数据时,我一点问题都没有,但是当我需要取出数据时(获取字符串,将其解析为JSON,然后解析为列表),它就会崩溃。有什么想法吗??提前谢谢

ORIKA映射

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();
EncuestaDTO

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;

好的,我终于明白了。问题是Orika在默认情况下试图对其进行映射,然后尝试进行自定义映射。这意味着它崩溃了,因为默认情况下它不知道如何映射它

通过添加和“.exclude”(“respuestas”)”,然后手动配置映射(如代码所示),我得到了我想要的所有映射。就代码而言,应该是这样的:

mapperFactory.classMap(EncuestaDTO.class, Encuesta.class).mapNulls(false).exclude("respuestas").byDefault().customize(new CustomMapper<EncuestaDTO, Encuesta>()
mapperFactory.classMap(EncuestaDTO.class,Encuesta.class).mapNulls(false).exclude(“respuestas”).byDefault().customize(new CustomMapper())
@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)
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;
mapperFactory.classMap(EncuestaDTO.class, Encuesta.class).mapNulls(false).exclude("respuestas").byDefault().customize(new CustomMapper<EncuestaDTO, Encuesta>()