MapStruct требует класс Impl
У меня есть следующие классы:
Картограф
public interface DeviceTokensMapper {
DeviceTokensMapper INSTANCE = Mappers.getMapper(DeviceTokensMapper.class);
@Mappings({
@Mapping(source = "tokenName", target = "tokenName"),
@Mapping(source = "userOsType", target = "osType"),
})
DeviceTokensDTO toDeviceTokensDTO(DeviceTokens deviceTokens);
}
Сущность:
@Entity
public class DeviceTokens {
@Id
@Column(name="token_name", nullable = false)
private String tokenName;
@Column(name = "os", nullable = false)
@Enumerated
private UserOSType userOsType;
public DeviceTokens() {}
public DeviceTokens(String tokenName, UserOSType userOSType) {
this.tokenName = tokenName;
this.userOsType = userOSType;
}
public String getTokenName() {
return tokenName;
}
public void setTokenName(String tokenName) {
this.tokenName = tokenName;
}
public UserOSType getUserOsType() {
return userOsType;
}
public void setUserOsType(UserOSType userOsType) {
this.userOsType = userOsType;
}
}
DTO:
public class DeviceTokensDTO {
private String tokenName;
private UserOSType osType;
public DeviceTokensDTO() {}
public DeviceTokensDTO(String tokenName, UserOSType osType) {
this.tokenName = tokenName;
this.osType = osType;
}
public UserOSType getOsType() {
return osType;
}
public void setOsType(UserOSType osType) {
this.osType = osType;
}
public String getTokenName() {
return tokenName;
}
public void setTokenName(String tokenName) {
this.tokenName = tokenName;
}
}
И метод из классаspring service , где я использую это отображение:
@Transactional
public DeviceTokensDTO storeToken(String tokenId, UserOSType userOsType) {
DeviceTokens deviceTokens = new DeviceTokens(tokenId, userOsType);
DeviceTokens newDevice = deviceTokensRepository.save(deviceTokens);
return DeviceTokensMapper.INSTANCE.toDeviceTokensDTO(newDevice);
}
Когда я запускаю метод выше, я вижу следующее исключение:
Ошибка [dispatcherServlet]:? - Сервлет.service () для сервлета
[dispatcherServlet] в контексте с path [] вызвал исключение [обработчик
ошибка обработки; вложенное исключение
Ява.яз..ExceptionInInitializerError] с первопричиной
Ява.яз..ClassNotFoundException:
ДТО.DeviceTokensMapperImpl
Так почему mapper требует реализации класса? Может пожалуйста, кто-нибудь посоветует?
Спасибо.
7 ответов:
MapStruct генерирует код во время компиляции,и вызов
Mappers.getMapper(DeviceTokensMapper.class);будет искать сгенерированную реализацию интерфейса mapper. По какой-то причине он, кажется, отсутствует в вашем подразделении развертывания (война и т. д.).Кстати. при работе с Spring в качестве контейнера DI вы можете использовать
@Mapper(componentModel="spring"), и вы сможете получать экземпляры mapper через инъекцию зависимостей вместо использования фабрикиMappers.
Вы оба mapstruct-процессор-ХХ и mapstruct-ХХ библиотек, входящих в ваш проект?
У меня была та же проблема, и я понял, что забыл включить mapstruct-processor-xx.
Если вы используете maven, вам нужно добавить зависимость mapstruct-processor следующим образом:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.2.0.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> </dependency>
Вы используете Maven? Если да, то, скорее всего, вы пропустили конфигурацию mapstruct-процессора в плагине компилятора maven.
Правильная конфигурация выглядит следующим образом:
<dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher --> <version>${org.mapstruct.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.6</source> <!-- or higher, depending on your project --> <target>1.6</target> <!-- or higher, depending on your project --> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
В моем случае я обернул
<plugin>в теги<pluginManagement>, чтобы обойти ошибку eclipse (Mars) следующим образом<pluginManagement> <plugin> ... </plugin> </pluginManagement>Удаление тегов
<pluginManagement>исправило это для меня.
Я столкнулся с той же проблемой в своем проекте с gradle. И я заменяю
build.gradelизcompile 'org.mapstruct:mapstruct:1.2.0.CR2'К
compile 'org.mapstruct:mapstruct-jdk8:1.1.0.Final' compile 'org.mapstruct:mapstruct-processor:1.1.0.Final'Затем sh build clean&build. Теперь это работает!
Я столкнулся с этой проблемой, потому что я не бежал
./gradlew clean build(gradlew.batдля Windows) после создания / редактирования класса mapper или связанных классов.Кроме того, кое-что, что я нашел полезным, это
./gradlew clean build -x testработает, но не запускает весь ваш тест, что было очень много в моем случае.
Comments