7

I'm using ModelMapper in my rest apps.

I have to convert List to List.

This is my code:

 Converter<List<UserRole>,List<String>> listConverter = new Converter<List<UserRole>, List<String>>() {
    public List<String> convert(MappingContext<List<UserRole>, List<String>> context) {
        List<String> target = new ArrayList<String>();
        List<UserRole> userRoles = context.getSource();
        for (UserRole userRole : userRoles) {
            target.add(userRole.getRole().getName());
        }
        return target;
    }
};

PropertyMap<User, UserDTO> propertiesForConvertToDto = new PropertyMap<User, UserDTO>() {
    protected void configure() {
        using(listConverter).map(source.getUserRoles()).setRoles(null);
    }
};

When I'm running app I get this error:

    HTTP Status 500 - Request processing failed; nested exception is org.modelmapper.MappingException: ModelMapper mapping errors:

type Exception report

message Request processing failed; nested exception is org.modelmapper.MappingException: ModelMapper mapping errors:

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.modelmapper.MappingException: ModelMapper mapping errors:

1) Failed to instantiate instance of destination java.util.List. Ensure that java.util.List has a non-private no-argument constructor.
Caused by: java.lang.NoSuchMethodException: java.util.List.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.modelmapper.internal.MappingEngineImpl.instantiate(MappingEngineImpl.java:366)
    at org.modelmapper.internal.MappingEngineImpl.createDestination(MappingEngineImpl.java:382)

Can You help me? I'm trying solve this problem for five hours. When I'm debugging I knew that converter work correctly. May don't I correctly called converter?

Esko
  • 29,022
  • 11
  • 55
  • 82
insectoman
  • 73
  • 1
  • 1
  • 5
  • Have you added the mapping to your `ModelMapper mapper` as `mapper.addMappings(propertiesForConvertToDto)`?. Please add your `ModelMapper`configuration (important) and the entities `User`and `UserDto` if is possible with the properties as well (if you want). – Pau Aug 18 '16 at 18:30

3 Answers3

3

Please use below snippet for ModelMapper implementation before mapping.

import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Component;

    @Component
    public class ModelMapperUtil extends ModelMapper{
        public ModelMapperUtil() {       
        this.getConfiguration().setFieldMatchingEnabled(true).setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE);
        }   
    }

Now try to map the objects values like

//implicit maaping    
UserDTO dto = mapper.map(userVO, UserDTO.class);

Dont forget to add jar file https://mvnrepository.com/artifact/org.modelmapper/modelmapper/0.7.5

2

Please make sure you have defined your ModelMapper bean

//Define ModelMapper class in your configuration
    @Bean
    public ModelMapper modelMapper(){
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.addMappings(propertiesForConvertToDto);
        return modelMapper;
    }
Righto
  • 855
  • 3
  • 11
  • 32
0

you try to map to the destination type List. Try instead list a concrete list implementation, e.g. ArrayList. As you can see, the problem is, that model mapper cannot instantiate the list. Should be solved if you use a concrete type. Another try can be, you use a provider which instantiates the appropriate type. Kind regards.

Matthias Brenner
  • 372
  • 1
  • 3
  • 10