Общее картографирование с использованием отражения — ModelMapperJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Общее картографирование с использованием отражения — ModelMapper

Сообщение Anonymous »

Как я могу автоматически отображать модели, подобные приведенным ниже?

Код: Выделить всё

public class RewardClaim {
private PlayerEntity owner; // PlayerEntity extends Entity which has a .getId()
}
Сопоставляет

Код: Выделить всё

public class RewardClaimResponseModel {
private String ownerId;
}
Это РАБОТАЕТ нормально, если я реализую это вручную:

Код: Выделить всё

Converter entityToEntityIdConverter = context -> {
Entity entity = context.getSource();
return entity != null ? entity.getId() : null;
};

modelMapper.typeMap(RewardClaim.class, RewardClaimResponseModel.class)
.addMappings(mapper -> mapper.using(entityToEntityIdConverter)
.map(RewardClaim::getOwner, RewardClaimResponseModel::setOwnerId));
Однако этот тип сопоставления сущности со строковым идентификатором должен выполняться много раз, и я не хочу вручную добавлять каждое сопоставление, как показано выше. Поэтому мне нужно обобщить решение. Другой пример:

Код: Выделить всё

private UserEntity user; -> private String userId; // Another example
По сути, что-то вроде этого псевдокода

Код: Выделить всё

modelMapper.typeMap(Object.class, Object.class)
.addMappings(mapper -> mapper.using(entityToEntityIdConverter)
.map(FIND HERE THE get FUNCTION, FIND HERE THE set FUNCTION));
Я не совсем понимаю, как работает modelMapper, но я пробовал несколько способов добиться этого с помощью конвертеров и карт типов с помощью Reflection, но безуспешно.
Одна из последних попыток здесь, но нет никакого представления о том, как получить исходный класс и целевой класс.

Код: Выделить всё

Converter entityToEntityIdConverter = context -> {
Entity entity = context.getSource();
return entity != null ? entity.getId() : null;
};

modelMapper.typeMap(Object.class, Object.class).addMappings(mapper -> {
Class sourceClass = null; //TODO: HOW TO GET THIS DYNAMICALLY?
Class destinationClass = null; //TODO: HOW TO GET THIS DYNAMICALLY?

for (Method setMethod : destinationClass.getDeclaredMethods()) {
if (setMethod.getName().endsWith("Id") && setMethod.getReturnType() == String.class) {
String propertyName = setMethod.getName().substring(3, setMethod.getName().length() - 2); // Remove "set" and "id"
try {
Method getMethod = sourceClass.getMethod("get" + propertyName, sourceClass);
mapper.using(entityToEntityIdConverter).map(src -> {
// Try catch here removed for simplicity
return getMethod.invoke(src);
}, (dest, v) -> {
setMethod.invoke(dest, v);
});
} catch (NoSuchMethodException e) {
// Setter method not found, ignore
}
}
}
});
Это кажется выполнимым, но мне не повезло. Есть идеи, как я могу этого добиться?

Подробнее здесь: https://stackoverflow.com/questions/787 ... odelmapper
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»