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 требует реализации класса? Может пожалуйста, кто-нибудь посоветует?
Спасибо.

551   7  

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

    Ничего не найдено.