Following up on this question DTO interfaces for implementing web service integration I came up with this implementation.
Data Transfer Object interface following a java.util.Map protocol. The implementation uses Guava's ForwardingMap.
public interface Dto<K, V> extends Map<K, V> {}
public class DtoImpl<K, V> extends ForwardingMap<K, V> implements Dto<K, V> {
private final Map<K, V> delegate;
@Override
protected Map<K, V> delegate() {
return this.delegate;
}
private DtoImpl(final Map<K, V> map) {
this.delegate = map;
}
public static <K, V> Dto<K, V> of(final Map<K, V> map) {
return new DtoImpl<K, V>(map);
}
}
Mapper interface between a type T and a Dto.
public interface Mapper<T> {
public <K, V> Dto<K, V> toDto(T obj);
public <K, V> T fromDto(Dto<K, V> dto, Class<T> clazz);
}
public class MapperImpl<T> implements Mapper<T> {
public <K, V> Dto<K, V> toDto(T obj) {
ObjectMapper objectMapper = new ObjectMapper();
Map<K, V> map = objectMapper.convertValue(obj, Map.class);
return DtoImpl.of(map);
}
public <K, V> T fromDto(Dto<K, V> dto, Class<T> clazz) {
ObjectMapper objectMapper = new ObjectMapper();
T obj = objectMapper.convertValue(dto, clazz);
return obj;
}
}
Comments and improvements on this implementation are welcome!
Is it worth it to define the Mapper interface with something like interface Mapper<T, K, V>
? Ideally I would like to say interface Mapper<T, S extends Dto<K, V>>
but this is not possible or is it?