Почему я не могу ссылаться на параметр @Context в атрибутах @Mapping?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему я не могу ссылаться на параметр @Context в атрибутах @Mapping?

Сообщение Anonymous »

При использовании Mapstruct мне нужен метод сопоставления с несколькими источниками и чтобы эти несколько источников передавались другим методам сопоставления, чтобы я мог иметь все свои источники для всех методов сопоставления, где мне нужны эти дополнительные источники. >
В настоящее время есть две функции, которые можно было бы заставить работать вместе:
  • только @Context можно передавать другим методы сопоставления, но его нельзя использовать в качестве источник.
  • вторичный параметр (не @Context) может использоваться в качестве источника, но он не передается другим методам сопоставления.
Таким образом, эта функция должна заключаться в том, чтобы либо разрешить передачу параметров вторичного источника другим методам сопоставления, либо сделать так, чтобы на параметр @Context можно было ссылаться с помощью @Mapping(target="something", source= "ctx.somethingElse") или @Mapping(target="ctx.something", source="somethingElse)
Пример:

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

// source classes : `Instant timestamp` is a field I obtain separately

Instant timestamp;

class WrapperSource
List nested;

class NestedSource
String name;

// target classes : I want to map the nested and name field but also to insert the timestamp in both the WrapperTarget and every NestedTarget in the nested list

class WrapperTarget
Instant timestamp;
List nested;

class NestedTarget
String name;
Instant timestamp;
В идеале сопоставление должно выглядеть примерно так:

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

// Currently this doesn't work because we can't reference the @Context in the source attribute

@Mapping(target = "nested", source="source.nested")
@Mapping(target = "timestamp", source="timestamp")
WrapperTarget map(WrapperSource source, @Context Instant timestamp);

@Mapping(target = "name", source="source.name")
@Mapping(target = "timestamp", source="timestamp")
NestedTarget map(NestedSource source, @Context Instant timestamp);
Или:

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

// Currently this doesn't work because the second method with 2 sources in not called by the first generated method

@Mapping(target = "nested", source="source.nested")
@Mapping(target = "timestamp", source="timestamp")
WrapperTarget map(WrapperSource source, Instant timestamp);

@Mapping(target = "name", source="source.name")
@Mapping(target = "timestamp", source="timestamp")
NestedTarget map(NestedSource source, Instant timestamp);
Единственное (подробное) решение, которое мне подходит:

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

// @Context is passed around and I can manually use it as a source in an @AfterMapping but it requires additional code

WrapperTarget map(WrapperSource source, @Context Instant timestamp);

@AfterMapping
void map(WrapperSource source, @MappingTarget WrapperTarget target, @Context Instant timestamp) {
target.setTimestamp(timestamp);
}

NestedTarget map(NestedSource source, @Context Instant timestamp);

@AfterMapping
void map(NestedSource source, @MappingTarget NestedTarget target, @Context Instant timestamp) {
target.setTimestamp(timestamp);
}
Это работает нормально, но требует дополнительного ручного кода, поэтому лучшей альтернативой была бы возможность ссылаться на @Context в атрибутах @Mapping. Таким образом, я мог бы использовать первый «идеальный» пример сопоставления.
Есть ли лучший обходной путь для этой проблемы?

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

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

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

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

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

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