2015-04-15 1 views
2

J'essaye d'implémenter une sorte de "système de sondage" sur mon site web basé sur Spring MVC + MySQL. Le problème que j'ai est que j'ai 2 classes que j'essaye de représenter. L'un est le DTO que j'utilise pour déplacer les données à travers le web, et l'autre est celui que j'utilise pour accéder à la base de données avec Hibernate. Jusqu'ici tout va bien. L'idée que j'essaye de mettre en application est d'avoir quelques listes sur le DTO, de les transformer en JSON et de les sauvegarder ensuite sur la base de données (sous forme de chaîne).Exception avec Orika Mapper + Gson (JSON) + MySQL

Maintenant, afin de mapper ces 2 objets, j'utilise une carte personnalisée Orika. La chose amusante qui m'arrive est que je suis capable de sauvegarder les listes que j'ai dans la base de données en JSON (j'utilise GSON pour les convertir), mais quand j'en ai besoin, Orika jette et exception.

Je vais essayer maintenant de mettre mon code aussi clair que possible pour voir si quelqu'un peut m'aider. Comme je vous le dis, quand vient le temps de sauvegarder les données, je n'ai pas de problème du tout, mais quand je dois le sortir (obtenir la chaîne, l'analyser en JSON et ensuite en Liste), il s'effondre . Des idées?? Merci à l'avance

ORIKA CARTOGRAPHIE

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

Encuesta

@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; 

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; 

MANAGER

@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 
} 

EXCEPTION
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 TABLE

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; 

Répondre

3

OK, j'ai finalement obtenu. Le problème était que Orika a essayé de le mapper par défaut et, par la suite, a essayé de faire le mappage personnalisé. Cela signifie qu'il s'est écrasé car il ne savait pas comment le mapper par défaut. En ajoutant et ".exclude (" respuestas ")" et plus tard configurer le mappage manuellement (comme indiqué dans le code), j'ai tout mappé comme je le voulais. En termes de code, ce serait comme ceci:

mapperFactory.classMap(EncuestaDTO.class, Encuesta.class).mapNulls(false).exclude("respuestas").byDefault().customize(new CustomMapper<EncuestaDTO, Encuesta>()