Вдохновленный this answer, я написал собственный конвектор (вы можете найти весь рабочий пример в Github repo). для бульдозеров, чтобы конвертировать между:Как собирать коллекции неизменяемых объектов в бульдозер
public class MyEntity {
private List<ObjectId> attachmentIds;
public List<ObjectId> getAttachmentIds() { return attachmentIds; }
public void setAttachmentIds(List<ObjectId> attachmentIds) {
this.attachmentIds = attachmentIds;
}
}
И его DTO:
public class MyEntityDto {
private List<FileDataDto> attachments;
public List<FileDataDto> getAttachments() { return attachments; }
public void setAttachments(List<FileDataDto> attachments) {
this.attachments = attachments;
}
}
MyEntity
содержит только идентификаторы для файлов, хранящихся в Монго Databse. Его DTO, который отправляется интерфейсу в JSON, должен содержать как идентификатор, так и имя файла (который является содержимым класса FileDataDto
). Мой конвертер:
public class FileIdToFileDataConverter extends DozerConverter<ObjectId, FileDataDto> {
public FileIdToFileDataConverter() {super(ObjectId.class, FileDataDto.class); }
@Override
public FileDataDto convertTo(ObjectId source, FileDataDto destination) {
if (source == null) {
return null;
}
FileDataDto fileData = destination == null ? new FileDataDto() : destination;
fileData.setId(source.toString());
// fetch the file from repository and update the name from db
fileData.setFilename("myfile.txt");
return fileData;
}
@Override
public ObjectId convertFrom(FileDataDto source, ObjectId destination) {
return source == null ? null : new ObjectId(source.getId());
}
}
Конверсия работает, как ожидалось в MyEntity
направлении ->MyEntityDto
. Однако это не соответствует обратному. Он использует ObjectId
, созданный Dozer (передан как аргумент destination
) вместо того, который возвращается преобразователем. Этот тест
@Test
public void dtoToMyEntity() {
MyEntityDto dto = new MyEntityDto();
FileDataDto fileData = new FileDataDto();
fileData.setFilename("file.txt");
fileData.setId(new ObjectId().toString());
dto.setAttachments(Arrays.asList(fileData));
MyEntity myEntity = mapper.map(dto, MyEntity.class);
assertEquals(fileData.getId(), myEntity.getAttachmentIds().get(0).toString());
}
завершается с сообщением, например:
org.junit.ComparisonFailure:
Expected :56b0a9d110a937fc32a6db18
Actual :56b0a9d110a937fc32a6db19
Вы можете найти весь тест и конфигурацию я использую в Github repo.
Как сделать преобразователь работать в обоих направлениях?