2017-02-17 10 views
0

Я написал mapstruct картограф, который использует отображение как это:Force не mapstruct называть есть * методы

@Mapping(target = "userId", source = "id.userId") 

Когда я смотрел на сгенерированном классе mapstruct Я stubled на этот код:

if (!foobar.hasId()) { 
    return null; 
} 

Это проблема для меня, так как hasId() не знает, что здесь ожидает mapstruct. Могу ли я заставить mapstruct каким-то образом не генерировать код, который использует этот метод, но проверяет на id != null или что-то в этом роде?

Я мог бы использовать сопоставление, как @Mapping(target = "userId", expression= "java(...)"), но я думаю, что должен быть другой способ.

ответ

2

Да, вы можете заставить MapStruct не использовать те presenceCheckers. Дополнительную информацию вы можете найти в документации source presence checking.

В основном единственный способ сделать это - обеспечить реализацию MapStruct AccessorNamingStrategy. Вы можете просто расширить DefaultAccessorNamingStrategy и переопределить его isPresenceCheckMethod.

У вас есть доступ к методу ExecutableElement, и вы можете проверить тип его класса и другие вещи.

MyAccessorNamingStrategy extends DefaultAccessorNamingStrategy { 

    @Override 
    public boolean isPresenceCheckMethod(ExecutableElement element) { 
     //You can do your checks here. You can ignore certain methods, from certain classes 

    } 

Не забудьте зарегистрировать SPI с файлом META-INF-/services/com.example.MyAccessorNamingStrategy

Существует также examples, где вы можете найти пример для SPI.